C++中虚函数和动态绑定<下>

静态绑定:编译时绑定,通过对象调用

动态绑定:运行时绑定,根据地址确定

 

如下:C++类成员函数调用和绑定方式

    

    图片来自于:http://wenku.baidu.com/view/4f97390016fc700abb68fcb5.html

还有虚析构函数和虚函数表及其指针,由于时间和天气问题,明日继续。2012-02-26 00:53:08

 

前面说了动态绑定是根据地址来调用相应的函数,在C++中每个有虚函数的类中都有一个虚函数表,保存着该类中虚函数的地址,

而根据地址调用相应函数,正是通过将指向该虚函数表的指针赋值给了基类的指针,想了解更多关于虚函数表的只是,看以看看这位

大神写的,很详细:http://blog.csdn.net/haoel/article/details/1948051#

 

虚析构函数

看一个例子,说一下为什么类中定义了虚成员函数,析构函数也应定义为虚析构函数。

class TimeKeeper{

public:

  TimeKeeper();

  ~TimeKeeper();

  ...

};

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

上面一个基类,一个派生类,如果我们进行下面的调用,

TimerKeeper *ptk = new AtomicClock;

...

...

delete ptk;

这样进行一系列操作后,delete掉动态分配的对象,会有什么问题了?

这样操作,delete实际上只调用了基类,也就是TimeKeeper的析构函数,而未调用派生类的析构函数,

这将导致派生类中得成分未销毁,称为“局部销毁”现象。解决这个问题的做法很简单,给base class定义

一个virtual析构函数,此后删除派生类对象时就会如你想的那样,销毁整个对象,包括派生类部分。

 author:good90

参考:《effective C++》

    http://blog.csdn.net/haoel/article/details/1948051#

 

posted @ 2012-02-26 20:21  good90  阅读(1482)  评论(0编辑  收藏  举报