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

来源:百度文库 编辑:神马文学网 时间:2024/04/30 13:45:11
条款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析构函数.
本篇文章来源于:开发学院 http://edu.codepub.com   原文链接:http://edu.codepub.com/2009/1023/16697.php