条款07:为多态基类声明 virtual 析构函数
Declare destructors virtual in polymorphic base classes.
base class 未使用 virtual 析构函数的问题
当 derived class 对象经由一个 base class 指针被删除,而该 base class 的析构函数是 non-virtual 的,其结果未有定义(通常是调用 base class 的析构函数,而导致 derived 成分没有被销毁)。这种现象称为“局部销毁”,它会造成资源泄漏、败坏数据结构、在调试器上浪费时间等问题。
非 base class 使用 virtual 析构函数的问题
如果 class 不含 virtual 函数,通常表示它并不意图被用作一个 bass class,但如果此时使用 virtual 析构函数会导致对象体积增加。因为想要实现 virtual 函数,对象会携带一个 vptr(virtual table pointer)指针,该指针指向一个由函数指针构成的数组,称为vtbl(virtual table);每一个带有 virtual 的函数的 class 都有一个相应的 vtbl。当对象调用某一 virtual 函数,实际被调用的函数取决于该对象的 vptr 所指向的那个 vtbl。
只有当 class 内至少一个 virtual 函数时,才使用析构函数。
Last updated
Was this helpful?