为什么要定义虚析构函数

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

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

定义为虚析构函数:

为什么要定义虚析构函数_第1张图片为什么要定义虚析构函数_第2张图片

 

 

你可能感兴趣的:(C\C++基础)