频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

解析C++虚函数表

来源:Csdn博客 作者:陈皓 出处:巧巧读书 2007-12-20 进入讨论组

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

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

解析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)子类的成员函数被放到了第一个父类的表中。(所谓的第一个父类是按照声明顺序来判断的)

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

文字:http://www.qqread.com/cpp/h387617.html 更多文章 更多内容请看C/C++技术专题专题,或进入讨论组讨论。
更多专题 【深 度 阅 读】 相 关 文 章
    收藏此文】【 】【打印】【关闭
    相关图文阅读
    频道图文推荐
    健 康 咨 询
    时 尚 咨 询
    巧巧读书宗旨
    相关专题
    讨论组问题推荐
    站内各频道最新更新文档
    站内最新制作专题
    热门关键字导读
    Photoshop教 程照片处理 照片制作 PS快捷键 抠图
    计 算 机 故 障XP系统修复
    艺 术 与 设 计设计 流媒体 设计欣赏 边框
    计 算 机 安 全ARP
    站内频道文章精选
    巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章