虚基类表相对于虚函数表要稍微难理解些,故单独提出来。

  虚函数表是在对象生成时插入一个虚函数指针,指向虚函数表,这个表中所列就是虚函数。

  虚基类表原理与虚函数表类似,不过虚基类表的内容有所不同。表的第一项表示派生类对象指针相对于虚基类表指针的偏移,从第二项开始表示各个基类地址相对于虚基类表指针的偏移。

  程序

#include <cstdio>

class A
{
public:
int a;
int aa;
virtual void vfuna(){};
}; class B
{
public:
int b;
int bb;
virtual void vfunb(){};
}; class C: virtual public A,virtual public B
{
public:
int c;
int cc;
void vfuna(){};
}; int main(int argc, char** argv)
{
printf("%d\n", sizeof(C)); C c;
c.a = 0xaaaaaaaa;
c.aa = 0xbbbbbbbb;
c.b = 0xdddddddd;
c.bb = 0xeeeeeeee;
c.c = 0x11111111;
c.cc = 0x22222222;
C* pc = &c;
printf("%08x\n", pc);
}

  windows输出:

36
0034f834

  查看对象c内存0x34f834:

0034F834 60 
0034F835 57 
0034F836 1D 00 11 11 11 
0034F83B 11 22  
0034F83D 22 22  
0034F83F 22 58 57  
0034F842 1D 00 AA AA AA  
0034F847 AA 
0034F848 BB BB BB BB 4C 
0034F84D 57 
0034F84E 1D 00 DD DD DD 
0034F853 DD EE
0034F855 EE
0034F856 EE  
0034F857 EE

  查看虚基类表0x001d5760:

C::`vbtable':
001D5760 00 00 add byte ptr [eax],al
001D5762 00 00 add byte ptr [eax],al
001D5764 0C 00 or al,0
001D5766 00 00 add byte ptr [eax],al
001D5768 18 00 sbb byte ptr [eax],al
001D576A 00 00 add byte ptr [eax],al
001D576C 00 00 add byte ptr [eax],al
001D576E 00 00 add byte ptr [eax],al

  得派生类对象指针相对于虚基类表指针的偏移0,基类A地址相对于虚基类表指针的偏移12,基类B地址相对于虚基类表指针的偏移24。查看偏移12位内容为0x001d5758。其指向地址内容:

C::`vftable':
001D5758 91 xchg eax,ecx
001D5759 10 1D 00 00 00 00 adc byte ptr ds:[0],bl
001D575F 00 00 add byte ptr [eax],al

C::vfuna:
001D1091 E9 AA 05 00 00 jmp C::vfuna (1D1640h)

  偏移24位内容为0x0014574c,其指向地址内容为:

C::`vftable':
001D574C 0A 10 or dl,byte ptr [eax]
001D574E 1D 00 00 00 00 sbb eax,0
001D5753 00 F8 add al,bh

B::vfunb:
001D100A E9 F1 05 00 00 jmp B::vfunb (1D1600h)

  验证一个为虚基类A内容,一个为虚基类B内容。

【c++内存分布系列】虚基类表的更多相关文章

  1. C++ 虚继承实现原理(虚基类表指针与虚基类表)

    虚继承和虚函数是完全无相关的两个概念. 虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝.这将存在两个问题:其一,浪费存储空间:第二,存在二义性问题,通常可 ...

  2. C++ 虚基类表指针字节对齐

    下面博客转载自别人的,我也是被这个问题坑了快两天了,关于各种虚基类,虚继承,虚函数以及数据成员等引发的一系列内存对齐的问题再次详细描述 先看下面这片代码.在这里我使用了一个空类K,不要被这个东西所迷惑 ...

  3. c++ 虚函数多态、纯虚函数、虚函数表指针、虚基类表指针详解

    静态多态.动态多态 静态多态:程序在编译阶段就可以确定调用哪个函数.这种情况叫做静态多态.比如重载,编译器根据传递给函数的参数和函数名决定具体要使用哪一个函数.动态多态:在运行期间才可以确定最终调用的 ...

  4. C++中虚基类在派生类中的内存布局

    今天重温C++的知识,当看到虚基类这点的时候,那时候也没有太过追究,就是知道虚基类是消除了类继承之间的二义性问题而已,可是很是好奇,它是怎么消除的,内存布局是怎么分配的呢?于是就深入研究了一下,具体的 ...

  5. c/c++: c++继承 内存分布 虚表 虚指针 (转)

    http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html 前部分原创,转载请注明出处,谢谢! class Base  {  pu ...

  6. 【c++内存分布系列】单继承

    父类包括成员函数.静态函数.静态方法,子类包括成员函数.静态函数.静态方法的情况与一个类时完全一致,这里就不做分析了.子类单独包含虚函数时继承无关,也不做分析了. 一.父类子类都为空 #include ...

  7. RTTI、虚函数和虚基类的实现方式、开销分析及使用指导(虚函数的开销很小,就2次操作而已)

    白杨 http://baiy.cn “在正确的场合使用恰当的特性” 对称职的C++程序员来说是一个基本标准.想要做到这点,首先要了解语言中每个特性的实现方式及其开销.本文主要讨论相对于传统 C 而言, ...

  8. c++内存分布之虚函数(多继承)

    系列 c++内存分布之虚函数(单一继承) c++内存分布之虚函数(多继承) [本文] 结论 1.虚函数表指针 和 虚函数表 1.1 影响虚函数表指针个数的因素只和派生类的父类个数有关.多一个父类,派生 ...

  9. c++内存分布之虚函数(单一继承)

    系列 c++内存分布之虚函数(单一继承) [本文] c++内存分布之虚函数(多继承) 结论 1.虚函数表指针 和 虚函数表 1.1 影响虚函数表指针个数的因素只和派生类的父类个数有关.多一个父类,派生 ...

随机推荐

  1. linux源代码阅读笔记 linux文件系统(转)

    linux文件系统:   操作系统的文件数据除了文件实际内容外,还有非常多的属性,如文件权限(rwx)与文件属性(所有者.群组.时间参数等).   文件系统通常将这两部分数据存放在不同的块.权限属性放 ...

  2. the-type-java-lang-charsequence-cannot-be-resolved-in-package-declaration

    http://stackoverflow.com/questions/24301986/the-type-java-lang-charsequence-cannot-be-resolved-in-pa ...

  3. crontab 指定执行用户

    linux下可以通过配置crontab来定时执行任务,执行体可以是一条系统命令或自己写的一个脚本,同时可以指派用户来执行.配置crontab有两种方法.方法1.使用crontab命令,例如添加一个新的 ...

  4. hdu 4599 Dice 概率DP

    思路: 1.求f[n];dp[i]表示i个连续相同时的期望 则 dp[0]=1+dp[1]     dp[1]=1+(5dp[1]+dp[2])/6     ……     dp[i]=1+(5dp[1 ...

  5. lintcode:递归打印数字

    题目 用递归打印数字 用递归的方法找到从1到最大的N位整数. 样例 给出 N = 1, 返回[1,2,3,4,5,6,7,8,9]. 给出 N = 2, 返回[1,2,3,4,5,6,7,8,9,10 ...

  6. 欧拉工程第63题:Powerful digit counts

    题目链接 The 5-digit number, 16807=75, is also a fifth power. Similarly, the 9-digit number, 134217728=8 ...

  7. 通过一个简单的数据库操作类了解PHP链式操作的实现

    class Model{ public $table; //操作的表; private $opt; //查询的参数; private $pri; //表的主键; private $lastSql; / ...

  8. 【mongoDB高级篇①】聚集运算之group,aggregate

    group 语法 db.collection.group({ key:{field:1},//按什么字段进行分组 initial:{count:0},//进行分组前变量初始化,该处声明的变量可以在以下 ...

  9. phpmyadmin导入大sql文件失败解决办法

    摘自:http://www.xunway.com/info/post/499.asp 昨天小编的一个客户在在利用phpmyadmin导入大sql文件的时候,总是提示错误,反应给小编,小编也是第一次遇到 ...

  10. OGG-00782 - OGG 11.2.1.0.2 FOR Windows x64 Microsoft SQL Server

    OS ENV:主机名:           WIN-NO42QRNPMFAOS 名称:          Microsoft Windows Server 2008 R2 Datacenter OS ...