effective c++ 条款07:为多态基类声明virtual析构函数

记住:
带多态性质的基类应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。
class的设计目的如果不是作为基类使用,或不是为了具备多态性,就不该声明virtual析构函数。

class TimeKeeper {
public:
    TimeKeeper();
    ~TimeKeeper();
    ...
};
class AtomicClock: public TimeKeeper { ... };
class WaterClock: public TimeKeeper { ... };

TimeKeeper* ptk = getTimeKeeper(); //获得一个指向derived class的对象指针
...
delete ptk;  //因为TimeKeeper带着一个非virtual的析构函数,所以derived class的析构函数不会被调用,导致资源泄露。

解决这个问题,只需要

class TimeKeeper {
public:
    TimeKeeper();
    virtual ~TimeKeeper();
    ...
};


virtual函数的目的是允许derived class的实现得以定制化。任何class只要带有virtual函数,都几乎确定应该也有一个virtual析构函数。
如果class不含virtual函数,通常表示它并不会被用作一个基类,所以其析构函数不需要为virtual。

使用pure virtual析构函数,你必须为这个pure virtual析构函数提供一份定义。

class AMOV {
public:
    virtual ~AMOV() = 0;
};
AMOV::~AMOV() {}














猜你喜欢

转载自www.cnblogs.com/pfsi/p/9164540.html