条款7:为多态基类声明virtual析构函数
1、如果多态机制运用过程没有虚析构会怎么样?
答: 运用多态机制过程中,通过基类指针或引用指向子类,并且基类的析构函数不是虚析构函数,然后delete基类指针,但是析构过程中单纯调用的只是基类的析构函数,而子类的那一部分没有销毁,造成一种局部销毁的诡异现象!
2、那么我们啥时候需要用虚析构?
答: 任何class只要带有至少一个virtual成员函数,则几乎确定类应该有一个virtual析构函数!
3、是不是任何时候都需要添加virtual析构?
答: class不企图作为基类,则让他的析构函数为virtual不是好主意,因为会产生虚表指针和虚表造成额外的内存开销!
4、是不是我们的类没有virtual成员函数一定不会被局部销毁的诡异现象所伤害呢?
答: 不是。即使class完全不带virtual函数,也可能被"non-virtual析构问题"给伤害
我们重点说一下第4点吧!
举个例子: 标准string类不含有任何virtual函数,所以继承它并不是一个好主意!
class MyString :public std::string
{
//...
};
//运用多态,基类指针指向派生类,然后delete释放,造成局部销毁。
//即使我们的类中完全没有虚函数!
MyString* pstr = new MyString("my string");
std::string* ps;
ps = pstr;
delete ps;//会造成资源泄漏
所以,如果企图继承一个标准容器或者没有虚析构的类,拒绝诱惑吧!!(因为c++并没有提供类似java的final class或者c# 的sealed class那样的禁止派生机制!)
总结:
- 带多态性质的基类应该声明virtual析构函数。
- 如果一个class带有任何virtual函数,它应该拥有一个虚析构
- 如果class的设计目的不是作为基类或者多态性质,它就不应该声明virtual析构函数
结尾: 我是航行的小土豆,喜欢我的程序猿朋友们,欢迎点赞+关注哦!希望大家多多支持我哦!有相关不懂问题,可以留言一起探讨哦!
如有引用或转载记得标注哦!