条款07:为多态基类声明virtual析构函数
(Declare destructors virtual in polymorphic base classes.)
内容:
一看到这个条款,你可能立刻就会提出你的疑问来推翻这个结论:如果不为多态基类声明virtual析
构函数,会发生什么灾难?好,其实答案是:当delete掉一个指向子类对象的基类指针时,它的行为是不可
定义的----------指向derived部分没有被销毁,析构函数也没有被调用而基类部分通常会被销毁,这样
就造成了一个可怕的"局部销毁"对象,造成了资源泄露、数据结构被损坏、浪费调试时间的惨状!这肯定不
是你想要的结局.当然解决的办法就是为base class析构函数加上virtual.
如果class当中没有virtual函数,通常表示它并不意图被当做base class,而你为它强行加上virt-
ual析构函数的话,可能会造成不好的后果.书上的一个例子是:
class SpecialString:public std::string{ //std::string有个non-virtual析构函数
...
};
//test.cpp
SpecialString* pss=new SpecialString("Impending Room");
std::string* ps;
...
ps = pss;
...
delete ps; //这里出现未定义错误!!!现实中*ps的SpecialString资源会泄露.
有时我们为基类提供一个pure virtual析构函数并且提供它的一份定义,这样我们会方便很多,因
为析构函数的运作发式是,derived类析构先调用然后自动调用base部分析构函数.例如有个类Shape想
被作为基类来使用,那么可以这样定义:
class Shape{
public:
virtual ~Shape() = 0;
};
Shape::~Shape(){}//implement
好了,今天就到这里.
请记住:
★ polymorphic base classes(多态基类)应该声明为一个virtual析构函数.如果class带有任何
virtual函数,它就应该拥有一个virtual析构函数.
★ classes的设计目的如果不是作为base classes使用,或不是为了具备多态性,就不该声明vir-
tual析构函数.