多继承类的虚表结构(感觉这个讲的不错,整理出来)

转载 2015年08月13日 17:19:12
原文出自:http://bbs.csdn.net/topics/390853050 <span style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; line-height: 15.4px;">@lisong694767315 的回答</span>
</pre><pre name="code" class="cpp">对于多重继承,如果类定义了虚函数,该类及其派生类就要生成一张虚拟函数表。如下继承关系(没有覆盖):
<img src="http://img.bbs.csdn.net/upload/201408/06/1407327509_945978.jpg" alt="" />
在子类Derive实例中的虚函数表:
<img src="http://img.bbs.csdn.net/upload/201408/06/1407327707_736164.jpg" alt="" />
</pre><pre name="code" class="cpp">子类自己定义的虚函数会被放到了第一个基类的虚函数表中。如果子类重写了基类的虚函数,则在虚函数表中,子类函数会覆盖相应的基类函数:
<img src="http://img.bbs.csdn.net/upload/201408/06/1407327922_878725.jpg" alt="" />
</pre><pre name="code" class="cpp">以上继承重写了f()函数,子类实例的虚函数表变为:
<img src="http://img.bbs.csdn.net/upload/201408/06/1407327989_963598.jpg" alt="" />
</pre><pre name="code" class="cpp"><span style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; line-height: 15.4px;">测试:</span>
<pre name="code" class="cpp">#include <cstdlib>
using namespace std;
 
class Base1 {
public:
    virtual void f() { cout << "Base1::f" << endl; }
    virtual void g() { cout << "Base1::g" << endl; }
    virtual void h() { cout << "Base1::h" << endl; }
};
 
class Base2 {
public:
    virtual void f() { cout << "Base2::f" << endl; }
    virtual void g() { cout << "Base2::g" << endl; }
    virtual void h() { cout << "Base2::h" << endl; }
};
 
class Base3 {
public:
    virtual void f() { cout << "Base3::f" << endl; }
    virtual void g() { cout << "Base3::g" << endl; }
    virtual void h() { cout << "Base3::h" << endl; }
};
 
 
class Derive : public Base1, public Base2, public Base3 {
public:
    virtual void f() { cout << "Derive::f" << endl; }
    virtual void g1() { cout << "Derive::g1" << endl; }
 
};
 
typedef void(*Fun)(void);
 
int main()
{
    Fun pFun = NULL;
    Derive d;
    int** pVtab = (int**)&d;
 
    //Base1's vtable
    pFun = (Fun)pVtab[0][0];
    pFun();
 
    pFun = (Fun)pVtab[0][1];
    pFun();
 
    pFun = (Fun)pVtab[0][2];
    pFun();
 
    //Derive's vtable
    pFun = (Fun)pVtab[0][3];
    pFun();
 
    //Base2's vtable
    pFun = (Fun)pVtab[1][0];
    pFun();
 
    pFun = (Fun)pVtab[1][1];
    pFun();
 
    pFun = (Fun)pVtab[1][2];
    pFun();
 
    //Base3's vtable
    pFun = (Fun)pVtab[2][0];
    pFun();
 
    pFun = (Fun)pVtab[2][1];
    pFun();
 
    pFun = (Fun)pVtab[2][2];
    pFun();
 
    system("pause");
    return 0;
}




输出:
</pre><pre name="code" class="cpp">Derive::f
Base1::g
Base1::h
Derive::g1
Derive::f
Base2::g
Base2::h
Derive::f
Base3::g
Base3::h
请按任意键继续. . .



虚拟继承和虚表

普通继承和虚拟继承:
  • u014805066
  • u014805066
  • 2016年01月28日 13:42
  • 464

再谈协方差矩阵之主成分分析

自从上次谈了协方差矩阵之后,感觉写这种科普性文章还不错,那我就再谈一把协方差矩阵吧。上次那篇文章在理论层次介绍了下协方差矩阵,没准很多人觉得这东西用处不大,其实协方差矩阵在好多学科里都有很重要的作用,...
  • aihali
  • aihali
  • 2015年05月18日 08:45
  • 431

VTABLE(虚表)的结构

VTABLE(虚表)的结构--uper以下是vtable和class的对应关系  class Pointclass Point...{public:    virtual ~Point();    v...
  • uper945
  • uper945
  • 2007年12月20日 11:20
  • 1760

虚函数表的实现细节

·虚表是怎么实现的? 虚表存放在哪里? ·虚表中的数据是在什么时候确定的? ·对象中的虚表指针又在什么时候赋值的? 我们很难通过 C++语言本身来找到答案。 C++标准给编译器实现者定义了语法规范,...
  • lingfengtengfei
  • lingfengtengfei
  • 2013年10月06日 14:23
  • 8403

顺了一篇文章,讲hashCode和equals的,感觉不错.

原链接:http://kakajw.iteye.com/blog/935226 一、java对象的比较 等号(==): 对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例...
  • tomlucky001
  • tomlucky001
  • 2014年03月18日 20:43
  • 427

makefile(感觉不错,转载了)

最近在学习Linux下的C编程,买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊,可能是我的理解能不行。             于是google到了以下这篇文章。通俗...
  • kjtt_kjtt
  • kjtt_kjtt
  • 2014年09月01日 11:25
  • 230

【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)

c++单继承、多继承、菱形继承内存布局(虚函数表结构)
  • SuLiJuan66
  • SuLiJuan66
  • 2015年10月04日 18:44
  • 2832

查看C++类的虚表(vtable)结构

假定源文件如下: #include #include class IA { public: virtual ~IA() {} virtual void PrintA() = 0; virtua...
  • CaspianSea
  • CaspianSea
  • 2015年07月22日 09:01
  • 1529

UVA1619 感觉不错

题意:求一段连续子序列al,…,ar,使(al+..+ar)*min{al,…ar}尽量大.个人感想:明显的RMQ+前缀和,但是UVA有点坑,题目上的意思是pecial judge,可是输出必须得区间...
  • zzz805
  • zzz805
  • 2016年07月13日 20:33
  • 268

匈牙利算法 感觉不错哦

本文转自大牛博客:http://www.byvoid.com/blog/hungary/ 这是一种用增广路求二分图最大匹配的算法。它由匈牙利数学家Edmonds于1965年提出,因而得名。 定义 未...
  • aibianchendewo
  • aibianchendewo
  • 2013年05月09日 22:35
  • 366
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多继承类的虚表结构(感觉这个讲的不错,整理出来)
举报原因:
原因补充:

(最多只允许输入30个字)