小明同学゛ 发表于 2019-3-13 16:01:46

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:05

只要有一个函数被定义为虚函数,那么析构默认就是虚的

小明同学゛ 发表于 2019-3-13 16:16:32

BngThea 发表于 2019-3-13 16:06
只要有一个函数被定义为虚函数,那么析构默认就是虚的

这个函数可以是类中任意成员函数吗?

BngThea 发表于 2019-3-13 16:34:00

小明同学゛ 发表于 2019-3-13 16:16
这个函数可以是类中任意成员函数吗?

小明同学゛ 发表于 2019-3-13 17:23:33

BngThea 发表于 2019-3-13 16:34


谢谢,不过我想问的是为什么程序会调用两次基类的析构函数

BngThea 发表于 2019-3-14 08:47:17

小明同学゛ 发表于 2019-3-13 17:23
谢谢,不过我想问的是为什么程序会调用两次基类的析构函数

你不是有两个对象吗,一个子类的 一个父类的

Croper 发表于 2019-3-14 13:52:51

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]
查看完整版本: C++父子类中析构函数调用问题