Конструктор и Деструктор экземпляров в c ++ Полиморфизм - PullRequest
0 голосов
/ 14 марта 2019

У меня есть пример того, как я пытался создать производный класс "Dog" из базового класса "Animal", но я хочу создать экземпляры класса Animal и использовать его члены (я довольно новичок в полиморфизме в c ++).В результате получается 2 строки "Животное создано!"и 1 строка "Собака создана!"в то время как я ожидаю 1 строку каждой.

class Animal
{

private:

    int numberOfLegs;
    const char* name;
public:

    int getNumberOfLegs();
    const char* getName();
    virtual void ToString()
    {
        std::cout << "This animal has " << this->getNumberOfLegs();
        std::cout << "leg and its name is " << getName() << std::endl;
    }
    Animal(int, const char*);
    ~Animal();
};

int Animal::getNumberOfLegs()
{

    return this->numberOfLegs;
}

const char* Animal::getName()
{

    return this->name;
}

Animal::Animal(int legs, const char* name)
{

    this->numberOfLegs = legs;
    this->name = name;
    std::cout << "An animal is created!" << std::endl;
}

Animal::~Animal()
{

    std::cout << "An animal is destroyed!" << std::endl;
}

class Dog : public Animal
{
private:

    const char* speech;
public:
    void ToString()
    {

        std::cout << "This dog has " << this->getNumberOfLegs();
        std::cout << " legs and its name is " << this->getName();
        std::cout << " and it says " << this->speech << std::endl;
    }

    Dog(int, const char*, const char*);

    ~Dog();
};

Dog::Dog(int legs, const char* name, const char* speech) : Animal (legs, name)
{

    this->speech = speech;
    std::cout << "A dog is created!" << std::endl;
}

Dog::~Dog()
{

    std::cout << "A dog is destroyed!" << std::endl;
}

int main()
{

        Animal anAnimal(3, "Godzilla");
        Dog myDoge(4, "CuteDoge", "woof");
        char c;
        std::cin.get(c);
    }
}

Ответы [ 3 ]

1 голос
/ 14 марта 2019

В вашей иерархии Собака наследует от Животного. Это означает, что когда Собака строится, Животное, его родитель, конструируется первым. Вот почему, когда вы создаете Собаку, вы получаете «Животное создано» и «Собака создано».

Чтобы избежать других проблем, вы должны следовать правилу 3: у вас нетривиальный деструктор, поэтому вам также следует определить конструктор копирования и оператор присваивания. В противном случае у вас будет двойная и / или свободная память.

Кроме того, поскольку у вас могут быть нетривиальные дети в Animal, вы должны сделать деструктор виртуальным. В противном случае

std::unique_ptr<Animal> ptr = std::make_unique<Dog>();

без виртуального деструктора в Animal, деструктор Dog никогда не будет вызван.

0 голосов
/ 14 марта 2019

Эта строка:

Dog::Dog(int legs, const char* name, const char* speech) : Animal (legs, name)

Первая строка конструктора Dog - объекты также должны создавать все свои базовые классы () как часть конструкции - и здесь вы вызываете конструктор Animal с аргументами legs и name

0 голосов
/ 14 марта 2019

Поскольку Dog является Animal, и в вашем конструкторе вы можете увидеть:

Dog::Dog(int legs, const char* name, const char* speech) : Animal(legs, name)
                                                           ^^^^^^^^^^^^^^^^^^

вызывает конструктор базового класса.

So

Dog myDoge(4, "CuteDoge", "woof");

будет называть оба:

std::cout << "An animal is created!" << std::endl;
// ...
std::cout << "A dog is created!" << std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...