有继承的C++析构函数一定要用virtual

来源:互联网 发布:什么是淘宝客服工作 编辑:程序博客网 时间:2024/06/03 18:37

先补下virtual是啥

虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。 

 

先贴个代码,再解释

复制代码
#include <iostream>using namespace std;class Base{public:    Base(){cout<<"Base Construct"<<endl;};    ~Base(){cout<<"Base destroy"<<endl;}       };class A : public Base{public:    A(){cout<<"A Construct"<<endl;}    ~A(){cout<<"A destroy"<<endl;}};class Base1{public:    Base1(){cout<<"Base1 Construct"<<endl;};    virtual  ~Base1(){cout<<"Base1 destroy"<<endl;}       };class A1 : public Base1{public:    A1(){cout<<"A1 Construct"<<endl;}    ~A1(){cout<<"A1 destroy"<<endl;}};int main(){    Base* p = new A;    delete p;    cout<<"======================"<<endl;    Base1* p1 = new A1;    delete p1;    return 0;}/*  Base Construct  A Construct  Base destroy  ======================  Base1 Construct  A1 Construct  A1 destroy  Base1 destroy*/
复制代码

在代码尾部的注释就是输出。

Base的析构函数没有virtual

Base1的析构函数有virtual

 

Base* p = new A

delete p

这个过程只调用了Base的析构函数,没有调用A的析构函数。

这样在实际应用中会有不确定的后果,可能会memory leak

应该在A的析构函数中我们可能会销毁一些其他的资源,而这里并未调用。

所以要给Base的析构函数以virtual属性。

0 0
原创粉丝点击