为什么要定义虚析构函数

    xiaoxiao2023-11-24  192

    构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数 析构函数可以是虚的。虚析构函数用于指引 delete 运算符正确析构动态对象

    为什么要定义虚析构函数

    class Animal { public: Animal() { cout << "Animal: 构造函数" << endl; } virtual void Call() { cout << "Animal: Call" << endl; } virtual ~Animal() { cout << "Animal:析构函数" << endl; } }; class Cat:public Animal { public: Cat() { cout << "Cat: 构造函数" << endl; } virtual void Call() { cout << "Cat: Call" << endl; } virtual ~Cat() { cout << "Cat:析构函数" << endl; } }; void PlayObj() { Animal *al = new Cat(); al->Call(); delete al; } int main() { PlayObj(); system("pause"); return 0; }

    执行结果:

    没有定义为虚析构函数:这种问题很危险,造成内存泄漏。这就是虚析构函数的作用。

    虚析构函数用于指引 delete 运算符正确析构动态对象

    在继承中,使用父类对派生类对象操作时,编译器会给类添加一个虚函数表,里面来存放虚函数指针,如果基类的析构函数不是虚的,就会造成内存泄漏,具体表现为父类的内存被释放了,而子类的没有。

    定义为虚析构函数:

     

     
    最新回复(0)