Missing Derived class Destructor when object is created with the base class pointer(使用基类指针创建对象时,缺少派生类析构函数)
本文介绍了使用基类指针创建对象时,缺少派生类析构函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在下面的代码示例中,未调用派生类析构函数。知道为什么吗? 我有一个具有虚函数的基类。现在,我使用基类指针来创建派生类的新对象。我的理解是,当销毁派生类对象时,首先调用派生类的析构函数,然后调用基类。然而,我只看到基类的析构函数被调用。有人知道我做错了什么吗,或者我对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
推荐答案
基类的析构函数需要是虚的:
virtual ~DomesticAnimals() {
cout << "Domestic Animal kill" << endl;
};
为了避免混淆(参见注释):只有在通过指向其基类的指针删除对象的情况下,才需要将析构函数设为虚的。当需要多态时,通常是这种情况。
这篇关于使用基类指针创建对象时,缺少派生类析构函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:使用基类指针创建对象时,缺少派生类析构函数
基础教程推荐
猜你喜欢
- C++,'if' 表达式中的变量声明 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01