C++父子类中析构函数调用问题
#include <iostream>using namespace std;
class Animal {
public :
void sleep();
Animal() {
};
~Animal() {
cout << "父类析构函数已调用"<<endl;
};
virtual void breathe() {
cout << "父类:动物在呼吸"<<endl;
}
};
void Animal::sleep() {
cout << "睡觉中"<<'\n';
}
class Fish:public Animal {
public:
Fish() {
}
~Fish() {
cout <<"子类析构函数被调用"<<endl;
}
void breathe() {
cout << "子类:鱼在呼吸"<<endl;
}
};
int main() {
Fish fish;
Animal *ptr= new Fish;
ptr->breathe();
delete ptr;
return 0;
}
这个时候因为没有将子类析构函数声明为 virtual类型,所以会调用父类的析构函数
按理说就输出:
子类:鱼在呼吸
父类析构函数已调用
/****************************************************************/
但是实际结果会输出:
子类:鱼在呼吸
父类析构函数已调用
子类析构函数被调用
父类析构函数已调用
/****************************************************************/
求大佬解释一下为什么? 只要有一个函数被定义为虚函数,那么析构默认就是虚的 BngThea 发表于 2019-3-13 16:06
只要有一个函数被定义为虚函数,那么析构默认就是虚的
这个函数可以是类中任意成员函数吗?
小明同学゛ 发表于 2019-3-13 16:16
这个函数可以是类中任意成员函数吗?
是 BngThea 发表于 2019-3-13 16:34
是
谢谢,不过我想问的是为什么程序会调用两次基类的析构函数 小明同学゛ 发表于 2019-3-13 17:23
谢谢,不过我想问的是为什么程序会调用两次基类的析构函数
你不是有两个对象吗,一个子类的 一个父类的 int main() {
Fish fish; //声明一个Fish对象,调用Animal的构造函数,调用Fish的构造函数
Animal *ptr= new Fish; //声明一个Animal指针,指向一个新的Fish对象,调用Animal构造函数,调用Fish构造函数
ptr->breathe();//调用breathe()函数,因为基类中breathe声明为virtual的,直接调用派生类的breathe函数,输出:“子类:鱼在呼吸”;
delete ptr;//删除Animal指针所指向的对象,因为基类析构函数未声明为virtual的,直接执行基类的析构函数,输出;“父类析构函数已调用”
return 0;//退出函数,清理栈,析构Fish对象fish,执行Fish的析构函数,输出“子类析构函数已调用”,执行Animal的析构函数,输出“父类析构函数已调用”
}
页:
[1]