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

转载 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
请按任意键继续. . .



虚函数表的实现细节

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

C++内存分布 虚表 虚指针(非常重要)

C++内存分布 虚表 虚指针: class Base { public: int m_base; }; class DerivedA: public Base { publ...
  • hacker00011000
  • hacker00011000
  • 2016-05-15 21:03:47
  • 7342

C++深入虚表结构

1. 虚表与“虚函数表” 在“C/C++杂记:虚函数的实现的基本原理”一文中曾提到“虚函数表”的概念,只是为了便于理解,事实是:虚函数表并不真的独立存在,它只是虚表(virtual table)...
  • shinetzh
  • shinetzh
  • 2017-03-27 21:05:11
  • 388

VTABLE(虚表)的结构

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

继承、 虚继承和虚函数表对类的大小的影响

一、真空类 class CNull { }; 长度:1 内存结构: ?? 评注:长度其实为0,这个字节作为内容没有意义,可...
  • u014744118
  • u014744118
  • 2016-03-30 23:27:28
  • 2686

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

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

(好)C++ 多继承和虚继承的内存布局

警告. 本文有点技术难度,需要读者了解C++和一些汇编语言知识。 在本文中,我们解释由gcc编译器实现多继承和虚继承的对象的布局。虽然在理想的C++程序中不需要知道这些编译器内部细节,但不幸的是多重...
  • yockie
  • yockie
  • 2016-01-28 21:06:41
  • 2041

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

原文出自:http://bbs.csdn.net/topics/390853050 @lisong694767315的回答对于多重继承,如果类定义了虚函数,该类及其派生类就要生成一张虚拟函数表。如下继...
  • zjq9931
  • zjq9931
  • 2015-08-13 17:19:12
  • 609

虚表结构与虚继承内存对象模型

很好的一篇关于特定编译器的对象模型介绍,恰到好处,重新排版,原文地址: http://www.cnblogs.com/qlee/archive/2011/09/02/2163504.html ...
  • Challenge_C_PlusPlus
  • Challenge_C_PlusPlus
  • 2012-09-04 16:57:17
  • 843

记录几个C++多继承中,this指针与多虚表间编译与处理的疑问,看编译器的行为。

简单无理的的测试代码:#include #include using namespace std; class A { public: int x; int y; publ...
  • gzzaigcn
  • gzzaigcn
  • 2015-10-19 14:58:31
  • 2818
收藏助手
不良信息举报
您举报文章:多继承类的虚表结构(感觉这个讲的不错,整理出来)
举报原因:
原因补充:

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