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#