Отсутствует деструктор производного класса при создании объекта с помощью указателя базового класса - PullRequest
0 голосов
/ 12 июля 2020

В следующем примере кода деструкторы производного класса не вызываются. Есть идеи, почему? У меня есть базовый класс с виртуальными функциями. Теперь я использую указатель базового класса для создания новых объектов производного класса. Насколько я понимаю, когда объекты производного класса уничтожаются, сначала вызывается деструктор производного класса, а затем базовый класс. Однако я вижу только деструктор вызываемого базового класса. Кто-нибудь знает, что я делаю неправильно или где мое понимание C ++ неверно?

#include <iostream>
#include <bitset>
using namespace std; 

class DomesticAnimals 
{
    public:
        DomesticAnimals() {
            cout <<"Domestic Animal Base" <<endl;
        }; 
        ~DomesticAnimals() {
            cout <<"Domestic Animal kill " <<endl;
        }; 
        virtual void Speak() = 0;
        virtual void EatFood()= 0; 
        virtual int NoOfLegs() {
            return 4; 
        } ;
};


class Cat : public DomesticAnimals
{
    public:
        Cat(); 
        ~Cat(); 
        void Speak() override; 
        void EatFood() override; 
};

Cat::Cat()
{
    cout << "Kat was born" << endl;
}

Cat:: ~Cat()
{
    cout << "Kill de Cat" << endl; 
}
void Cat:: Speak()
{
    cout << "Meow Meow " << endl; 
}

void Cat::EatFood()
{
    cout <<"Kat eet de muis vandaag !! " <<endl; 
}


class Dog : public DomesticAnimals
{
    public:
        Dog();
        ~Dog();
        void Speak() override; 
        void EatFood() override; 
};

Dog::Dog()
{
    cout << "A puppy was born" << endl; 
}

Dog::~Dog()
{
    cout << "Kill de hond" << endl; 
}

void Dog :: Speak()
{
    cout <<"bow bow woof woof" <<endl;
}

void Dog :: EatFood()
{
    cout << "de hond eet een kip voor middageten" <<endl;
}

void DogActions()
{
    DomesticAnimals* dog = new Dog;
    cout<< endl;
    dog->Speak(); 
    dog->EatFood();
    cout<<"No of legs for dog = "<< dog->NoOfLegs() <<endl; 
    cout<<endl;
    delete dog; 
    dog = NULL;
}

void CatActions()
{
    DomesticAnimals* cat = new Cat; 
    cat->Speak(); 
    cat->EatFood(); 
    cout<<"No of legs for cat = "<< cat->NoOfLegs() << endl;
    delete cat; 
    cat = NULL; 
}

int main(void)
{
    DogActions();
    CatActions();
    return 0;
}

Результат программы следующий

Domestic Animal Base
A puppy was born

bow bow woof woof
de hond eet een kip voor middageten
No of legs for dog = 4

Domestic Animal kill 
Domestic Animal Base
Kat was born
Meow Meow 
Kat eet de muis vandaag !! 
No of legs for cat = 4
Domestic Animal kill 

1 Ответ

5 голосов
/ 12 июля 2020

Деструктор базового класса должен быть виртуальным. своему базовому классу. Обычно это тот случай, когда требуется полиморфизм.

...