In the class below from this [tutorial](http://www.learncpp.com/cpp-tutorial/121-pointers-and-references-to-the-base-class-of-derived-objects/) it says that 

> 
> you can also make m\_speak a std::string, but the downside of doing so
>  is that each Animal will contain a redundant copy of the “speak”
> 
> 
> 

I'm trying to understand this, how would using `string` instead of `char*` only create a redundant copy of `string` and not a `char*`. 

```
#include <string>
#include <iostream>

class Animal
{
protected:
    std::string m_name;
    const char* m_speak;

    // We're making this constructor protected because
    // we don't want people creating Animal objects directly,
    // but we still want derived classes to be able to use it.
    Animal(std::string name, const char* speak)
        : m_name(name), m_speak(speak)
    {
    }

public:
    std::string getName() { return m_name; }
    const char* speak() { return m_speak; }
};

class Cat: public Animal
{
public:
    Cat(std::string name)
        : Animal(name, "Meow")
    {
    }
};

class Dog: public Animal
{
public:
    Dog(std::string name)
        : Animal(name, "Woof")
    {
    }
};

```