条款07:为多态基类声明virtual析构函数(Declare destructors virtual in polymorphic base classes.)
1. base class需要声明virtual析构函数
当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未有定义—实际执行时
通常发生的是对象的derived成分没被销毁。
2. vptr ( virtual table pointer)指针
欲实现出virtual函数,对象必须携带某些信息,主要用来在运行期决定哪一个virtual函数该被调用。这份信息通常是由一个
所谓vptr ( virtual table pointer)指针指出。vptr指向一个由函数指针构成的数组,称为vtbl (virtual table);每一个带有virtual函数的
class都有一个相应的vtbl。当对象调用某一virtual函数,实际被调用的函数取决于该对象的vptr所指的那个vtbl—编译器在其中
寻找适当的函数指针。
3. 是否声明virtual析构函数
只有当class内含至少一个virtual函数,才为它声明virtual析构函数。
4. pure virtual析构函数
定义抽象class,但手上没有任何pure virtual函数时使用。
你必须为这个pure virtual析构函数提供一份定义:
AWOV::~AWOV()/ /Pure virtual析构函数的定义
{}
5. 总结
1)polymorphic(带多态性质的)base classes应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual
析构函数。
2)Classes的设计目的如果不是作为base classes使用,或不是为了具备多态性(polymorphically),就不该声明virtual析构函数。