您的位置:首页 > 编程语言 > C语言/C++

Effective C++ Item 07-为多态基类声明virtual析构函数

2016-08-05 15:11 232 查看
Item 07-为多态基类声明virtual析构函数

Declare destructors virtual in polymorphic base class

why? http://blog.csdn.net/wxqian25/article/details/7361069
Ex: 记录时间有多种做法,一个基类和一些派生类

class TimeKeeper{ // base class 基类

public:

TimeKeeper();

~TimeKeeper();

...

}

class AtomicClock:public TimeKeeper{...} //原子钟 derived类

class WaterClock:public TimeKeeper{...} //水钟 derived类

class WristClock:public TimeKeeper{...} //腕表 derived类

int main()

{

AtomicClock *p1 = new AtomicClock() //派生类

delete p1; //基类,派生类的析构函数都被执行

TimeKeeper *p2 = new AtomicClock() //base class

delete p2; //base class析构函数被执行,但是derived class 析构函数未被执行!!!,会造成内存泄漏!!!

}

解决办法:给base class一个virtual析构函数,此后就会执行derived class析构函数,即virtual ~TimeKeeper();

虚函数是C++中用于实现多态的机制,核心理念是通过基类访问派生类定义的函数。(只能借助与指针或引用来达到多态效果)

当class内至少有一个virtual函数,才会为它声明virtual析构函数。

析构函数的运作方式:最深层派生(most derived)的那个class,其析构函数最先被调用,然后是其每一个base class的析构函数都会被调用。

请记住:

1、"给base classes一个virtual析构函数"这个规则只适用与polymorphic(带多态性质的)base classes身上。这种base classes的设计目的是为了用来通过base class接口处理derived class对象。

2、polymorphic(带多态性质的)base class应该声明一个virtual析构函数,如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。

3、classes的设计目如果不是作为base classes使用,或不是为了具备多态性(polymorphically),就不该声明virtual析构函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: