虚析构函数

为什么定义虚析构函数:想通过父类指针,把所有的子类对象的析构函数都执行一遍,即想通过父类指针,释放所有的资源

实现:必须在基类析构函数前面加上virtual

认真看这个例子

#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;

class A
{
private :
    char * p;
public:
    A()
    {
        char * p = new char[20];
        strcpy(p, "obja");
        cout << "A的构造函数" << endl;
    }
    virtual ~A()
    {
        delete[] p;
        cout << "A的析构函数" << endl;
    }
};
class B : public A
{
private:
    char * p;
public:
    B()
    {
        char * p = new char[20];
        strcpy(p, "objb");
        cout << "B的构造函数" << endl;
    }
     ~B()
    {
        delete[] p;
        cout << "B的析构函数" << endl;
    }
};
class C : public B
{
private:
    char * p;
public:
    C()
    {
        char * p = new char[20];
        strcpy(p, "objc");
        cout << "C的构造函数" << endl;
    }
     ~C()
    {
        delete[] p;
        cout << "C的析构函数" << endl;
    }
};

void playobj(A * p)
{
    delete p;
}
void main()
{
    
    {
        //C * myc = new C;
        //playobj(myc);
        /*执行结果(~A()没有加virtual) 
        A的构造函数
        B的构造函数
        C的构造函数
        A的析构函数
        没有执行所有的析构函数,发生了内存泄漏
        */
    }
    
    A * p1 = new B;
    A * p2 = new C;
    delete p1;
    delete p2;
    /* 执行结果(~A()没有加virtual)
    A的构造函数
    B的构造函数
    A的构造函数
    B的构造函数
    C的构造函数
    A的析构函数
    A的析构函数
    没有执行所有的析构函数,发生了内存泄漏
    在~A()前加上virtual
    A的构造函数
    B的构造函数
    A的构造函数
    B的构造函数
    C的构造函数
    B的析构函数
    A的析构函数
    C的析构函数
    B的析构函数
    A的析构函数
    资源全部释放
    */

    system("pause");
}

推荐一篇有关虚析构的文章:https://www.cnblogs.com/liushui-sky/p/5824919.html

你可能感兴趣的:(c++知识)