继承一个没有虚析构函数的类是危险的[整理]
一个没有虚析构函数的类意味着不能做为一个基类。如std::string, std::complex, 和 std::vector 都是这样的。当你公有继承创建一个从基类继承的派生类时,指向新类对象中的指针和引用实际上都指向了起源的对象。因为析构函数不是虚函数,所以当你delete 一个这样的类时,C++就不会调用析构函数链。举个例子说明下吧:
#include "iostream.h"
class obj
{
public:
obj(){cout << "基类A构造了"<<endl;};
virtual ~obj(){cout << "基类A析构了"<<endl;};
virtual void fun(){cout<<"基类A打印"<<endl;};
};
{
public:
obj(){cout << "基类A构造了"<<endl;};
virtual ~obj(){cout << "基类A析构了"<<endl;};
virtual void fun(){cout<<"基类A打印"<<endl;};
};
class car:public obj
{
public:
car(){cout << "派生类B构造了"<<endl;};
virtual ~car(){cout << "派生类B析构了"<<endl;};
virtual void fun(){cout<<"派生类B打印"<<endl;};
};
{
public:
car(){cout << "派生类B构造了"<<endl;};
virtual ~car(){cout << "派生类B析构了"<<endl;};
virtual void fun(){cout<<"派生类B打印"<<endl;};
};
void main()
{
obj * a=new car;
a->fun();
delete a;
}
如果去掉基类的虚析构函数virtual,那么派生类的析构函数就不会被触发,很恐怖啊,可能会因此引起memory leak什么的。
{
obj * a=new car;
a->fun();
delete a;
}
如果去掉基类的虚析构函数virtual,那么派生类的析构函数就不会被触发,很恐怖啊,可能会因此引起memory leak什么的。