基类析构函数为虚函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基类析构函数为虚函数相关的知识,希望对你有一定的参考价值。

代码:析构函数为非虚函数

技术分享
#include <iostream>

using namespace std;

class A {
    public:
        A()
        {
            cout << "A" << endl;
        }

        ~A()
        {
            cout << "~A" << endl;
        }
};

class B : public A{
    public:
        B()
        {
            cout << "B" << endl;
        }

        ~B()
        {
            cout << "~B" << endl;
        }
};


int main(int argc, char** argv)
{
    A *pa = new B();
    delete pa;

    B *pb = new B();
    delete pb;
}
View Code

输出:

A
B
~A
A
B
~B
~A

指向子类对象的基类指针,析构过程未调用子类的析构函数,若子类申请内存空间,则将无法被释放,导致内存泄漏。

代码:析构函数为虚函数

技术分享
#include <iostream>

using namespace std;

class A {
    public:
        A()
        {
            cout << "A" << endl;
        }

        virtual ~A()
        {
            cout << "~A" << endl;
        }
};

class B : public A{
    public:
        B()
        {
            cout << "B" << endl;
        }

        virtual ~B()
        {
            cout << "~B" << endl;
        }
};


int main(int argc, char** argv)
{
    A *pa = new B();
    delete pa;

    B *pb = new B();
    delete pb;
}
View Code

输出:

A
B
~B
~A
A
B
~B
~A

指向子类对象的基类指针,析构过程先调用子类析构函数,再调用基类析构函数。

若析构函数为非虚函数时,delete p 会直接调用相应指针类型的析构函数 即父类析构函数。若析构函数为虚函数时,则会调用实际对象的析构函数,即子类析构函数,子类继承自父类,子类析构函数调用完,会接着调用父类析构函数。

以上是关于基类析构函数为虚函数的主要内容,如果未能解决你的问题,请参考以下文章

浅谈多态基类析构函数声明为虚函数

基类析构函数必须为虚函数否则会造成内存泄漏

C++ 构造函数不能是虚函数,基类析构函数应该为虚函数

访问冲突 - 为啥基类析构函数被调用两次? [关闭]

条款7:为多态基类析构函数声明为virtual

在 C++ 继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数