记住:
带多态性质的基类应该声明一个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() {}
原文地址:https://www.cnblogs.com/pfsi/p/9164540.html
时间: 2024-10-17 05:23:19