为多态基类声明virtual析构函数
在使用c++多态特性的时候,通常会用基类指针或者基类引用来指向派生类对象,如果派生类对象是动态创建出来的,当delete的时候传入的是基类指针,如果析构函数是non-virtual的话,那么就可能出现属于派生类对象的部分未被析构的情况。因此,任何class只要带有virtual函数都几乎确定应该有一个virtual析构函数。
但是无端地将所有class的析构函数函数声明为virtual,也是错误的。在c++中所有STL容器如vector,list,set,map等都是不带virtual析构函数的class。
某些情况将析构函数声明为pure virtual函数
比如有时候你希望拥有抽象class,但是手上没有任何pure virtual函数时,可以将该类的析构函数声明为pure virtual函数,然而这里有个窍门:你必须为这个pure virtual析构函数提供一份定义,因为抽象class的析构函数仍会在派生类的析构函数中被调用,如果不提供定义,那么连接器就会报错。
总结
给base class一个virtual析构函数,这个规则只适用于有多态性质的base class