条款07:为多态基类声明 virtual 析构函数
2020-09-29 本文已影响0人
robotai
总结:
1、带多态性质的base classes 应该声明一个virtual 析构函数。如果class 带有任何 virtual 函数,就应该拥有一个 virtual 析构函数。
2、class 设计的目的不是为了作为基类使用,或是不是为了具备多态性,就不该声明 virtual 析构函数。
知识细节记录:
1、理解 factory 函数:返回一个 base class 指针,指向生成的派生类对象。
2、当派生类对象 经由一个 base class 指针被删除,如果 base class 是 non virtual 析构函数,派生类对象的派生类部分不会被删除干净,会造成局部销毁,资源泄露的问题。
3、当一个类 不是基类时,定义了 virtual 析构函数,会导致类对象占用更多的内存。
4、必须与虚函数指针 vptr 指出运行期间会被调用的具体的虚函数。需要查询虚函数表 vtbl.
5、如果一个 类不带虚析构函数,就不要去继承,这种类包括STL容器,如 vector list set 等。
6、析构函数工作原理:最深的派生类的析构函数最先被调用,然后是其每一个base class 的析构函数被调用。
7、定义一个抽象类,用于继承 virtual 析构函数。
class A {
..
public:
virtual ~A() = 0; // pure virtual 析构函数
};
A::~A() {} //pure virtual 析构定义