terms 7 : Declear destructor virtual in polymorphic base class

为多态基类声明virtual析构函数

base class 和derived class ,在设计factory 函数时,我们通过函数获取一个对象指针,这个指针往往是指向derived class 的base class 指针,此时当销毁这个指针时,(如果未声明base class 的析构函数为virtual)系统调用的base class指针的析构函数,而不是derived class的析构函数(我们知道继承时,创建对象往往是先调用基类的构造函数,然后是派生类的构造函数,而析构时恰恰相反,先析构派生类,然后才是基类),因此,此时派生类的某些内容可能并未销毁,造成内存泄露。因此,最好为多态基类声明virtual析构函数,进一步,如果一个函数具有虚函数或者纯虚函数,我们就应该为其声明virtual析构函数。

另一方面,当我们需要一个abstract class时,但是我们有没有一个纯虚函数,这时候我们可以将析构函数声明为纯虚函数。

注:每一个带有virtual函数的class都有一个vtbl, 虚函数表,因为这个表的存在,类对象的占用空间可能会增大50~100%,(据说代码的移植性将不存在)

terms 8 : Prevent exceptions from leaving destructors

别让异常逃离析构函数

通过两个办法避免析构函数遭遇异常时吐出异常,析构函数自己将异常处理掉,或者结束进程

term 9 : Never call virtual functions during construction or destruction

绝不在构造和析构过程中调用virtual函数

在析构和构造中调用的virtual函数通常不是自己想要的,特别是在多级继承中,因此不要在构造和析构时调用virtual函数

04-26 01:01