您的位置:首页 > 编程语言 > C语言/C++

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

2015-07-16 17:15 288 查看
先补下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属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: