解析C++虚函数表

来源:Csdn博客 作者:陈皓 2007-12-20 出处:pcdog.com

ajax  ios  linux  p2p  windows xp  
上一页 1 2 3 下一页 

一般继承(无虚函数重载)

下面,再让我们来看看继承时的虚函数表是什么样的。假设有如下所示的一个继承关系:

解析C++虚函数表(图二)

图2

请注意,在这个继承关系中,子类没有重载任何父类的函数。那么,在派生类的实例中,其虚函数表如下所示:

对于实例:Derive d; 的虚函数表如下:

解析C++虚函数表(图三)

图3

我们可以看到下面几点:

1)虚函数按照其声明顺序放于表中。
2)父类的虚函数在子类的虚函数前面。

我相信聪明的你一定可以参考前面的那个程序,来编写一段程序来验证。

一般继承(有虚函数重载)

重载父类的虚函数是很显然的事情,不然,虚函数就变得毫无意义。下面,我们来看一下,如果子类中有虚函数重载了父类的虚函数,会是一个什么样子?假设,我们有下面这样的一个继承关系。

解析C++虚函数表(图四)

图4

为了让大家看到被继承过后的效果,在这个类的设计中,我只重载了父类的一个函数:f()。那么,对于派生类的实例,其虚函数表会是下面的一个样子:

解析C++虚函数表(图五)

图5

我们从表中可以看到下面几点,

1)重载的f()函数被放到了虚表中原来父类虚函数的位置。
2)没有被重载的函数依旧。

这样,我们就可以看到对于下面这样的程序,

  Base *b = new Derive();
b->f();  

由b所指的内存中的虚函数表的f()的位置已经被Derive::f()函数地址所取代,于是在实际调用发生时,是Derive::f()被调用了。这就实现了多态。

多重继承(无虚函数重载)

下面,再让我们来看看多重继承中的情况,假设有下面这样一个类的继承关系。注意:子类并没有重载复类的函数。

解析C++虚函数表(图六)

图6

对于子类实例中的虚函数表,是下面这个样子:

解析C++虚函数表(图七)

图7

我们可以看到:

1)每个父类都有自己的虚表。
2)子类的成员函数被放到了第一个父类的表中。(所谓的第一个父类是按照声明顺序来判断的)

这样做就是为了解决不同的父类类型的指针指向同一个子类实例,而能够调用到实际的函数。



上一页 1 2 3 下一页 
上一篇:C++中的向上类型转换和向下类型转换
下一篇:浅析C++中虚函数的调用及对象内部布局