一、源码

#include <iostream>class Base1
{
public:virtual void func11(){std::cout << "Base1::func11()" << std::endl;};virtual void func12(){std::cout << "Base1::func12()" << std::endl;}virtual void func13(){std::cout << "Base1::func13()" << std::endl;}virtual void func14(){std::cout << "Base1::func14()" << std::endl;}
};class Base2
{
public:virtual void func21(){std::cout << "Base2::func21()" << std::endl;}virtual void func22(){std::cout << "Base2::func22()" << std::endl;}virtual void func23(){std::cout << "Base2::func23()" << std::endl;}
};class Son : public Base1, public Base2
{
public:void func12(){std::cout << "Son::func12()" << std::endl;}void func23(){std::cout << "Son::func23()" << std::endl;}virtual void son1(){std::cout << "Son::son1()" << std::endl;}virtual void son2(){std::cout << "Son::son2()" << std::endl;}
};using FUNC = void (*)();int main()
{Base1 *pb1 = new Base1();Base2 *pb2 = new Base2();Son *psn = new Son();// 得到两个虚函数表指针的地址。long *snptr = (long *)psn;long *pvptr1 = snptr;long *pvptr2 = snptr + 1;// 得到两个虚函数表的指针。long *vptr1 = (long *)*pvptr1;long *vptr2 = (long *)*pvptr2;// 得到所有的虚函数的地址。FUNC f1, f2, f3, f4, f5, f6, f7, f8, f9;f1 = (FUNC) * (vptr1 + 0);f2 = (FUNC) * (vptr1 + 1);f3 = (FUNC) * (vptr1 + 2);f4 = (FUNC) * (vptr1 + 3);f5 = (FUNC) * (vptr1 + 4);f6 = (FUNC) * (vptr1 + 5);f7 = (FUNC) * (vptr2 + 0);f8 = (FUNC) * (vptr2 + 1);f9 = (FUNC) * (vptr2 + 2);// 执行。std::cout << "虚函数表1" << std::endl;f1();f2();f3();f4();f5();f6();std::cout << std::endl;std::cout << "虚函数表2" << std::endl;f7();f8();f9();std::cin.get();return 0;
}

结果:

虚函数表1
Base1::func11()
Son::func12()
Base1::func13()
Base1::func14()
Son::son1()
Son::son2()虚函数表2
Base2::func21()
Base2::func22()
Son::func23()

二、分析

三、结论

  1. 对于继承了多个带有虚函数的父类的子类来说,该类有多个虚函数表,虚函数表的数量和父类的数量相同。
  2. 若子类存在虚函数,那么这些虚函数的地址会放在继承的第一个父类的虚函数表中,即:子类和第一个父类公用一个虚函数表,虚函数地址罗列顺序是虚函数声明顺序。
  3. 类对象有多个虚函数表指针,数量和父类的数量相同。这些虚函数表指针会依次放到子类对象的开始位置。

(SAW:Game Over!)

Cpp 对象模型探索 / 多重继承虚函数表分析相关推荐

  1. Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)

    源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...

  2. Cpp 对象模型探索 / 含有虚基类的类的内存布局

    一.栗子 class Grand { public:int i_grand_ = 8; };class Parent1 : public virtual Grand { public:int i_pa ...

  3. Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序

    栗子 #include <iostream> class A { public:A() { std::cout << "A" << std::e ...

  4. Cpp 对象模型探索 / 系列文章的索引

    一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...

  5. Cpp 对象模型探索 / 对象的虚函数表指针的位置

    一.源码 #include <iostream>class A { public:virtual void func(){};public:int count_ = 0; };int ma ...

  6. Cpp 对象模型探索 / 虚函数表和虚函数表指针的创建时机

    一.虚函数表 在编译期间创建.编译器会为每个类确定好虚函数表(vtbl)的内容. 二.虚函数表指针 虚函数表指针跟随着对象,在运行期间创建.由于在编译期间编译器为每个类创建好了 vtbl,并且编译器会 ...

  7. [C++对象模型][8]多重继承与虚函数表

    一 多重继承 1) 代码: Code #include <iostream> using namespace std; class B1 { public:     int x;      ...

  8. 【C++】 C++虚函数表详细分析(上)

    C++虚函数表详细分析 01. 目录 C++虚函数表详细分析 01. 目录 02. 虚函数表 03. 测试代码 04. 指针基础知识 05. _vptr 06. 结果分析 07. vptr. vtab ...

  9. 虚函数继承与虚函数表-汇编码分析

    (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 参考:https://www.equestionanswers.com/cpp/vptr-and-vta ...

最新文章

  1. 军哥lnmp一键安装包nginx支持pathinfo配置
  2. FM的调制matlab仿真
  3. js简单的设置快捷键,hotkeys捕获键盘键和组合键的输入
  4. Numpy实现BP神经网络(包含Dropout、BN等训练技巧)
  5. C++设计模式之三 单例模式
  6. Leetcode每日一题:1030.matrix-cells-in-distance-order(距离顺序排列矩阵单元格)
  7. XGBoost深度理解
  8. 【洛谷】【treap/堆】P2073 送花
  9. 在VScode中使用opencv,配置好了以后无法找到opencv2/opencv.hpp的问题
  10. plsql如何显示表结构图_plsql导出导入 表结构、表数据、存储过程等
  11. 搜索巨头百度深耕中国量子产业
  12. 【考研数学一】微分方程专讲(初步)
  13. 计算机每天定时开机设置方法,电脑如何设置每天定时开机
  14. Java关键字详解-配视频讲解链接(附带一些面试题)
  15. 人工智能编程语言介绍
  16. m基于matlab的PCM-FM码同步和GMSK的调制和解调方法,包括多符号检测MSD和Turbo编解码
  17. 如何快速高效出高质量效果图
  18. 再说说TCP和UDP源端口的确定
  19. LightningChart数据可视化工具图形控件教程51-BarSeries3D
  20. 真正可以免费使用的员工电脑监控软件

热门文章

  1. RHEL7.0 DNS服务配置
  2. LYNC2013部署系列PART10:后端高可用部署
  3. 你不得不知道的Visual Studio 2012(3)- 创建Windows应用程序
  4. 打造Ubuntu下的SLAMP
  5. 【蓝桥杯】Python自带编辑器IDLE的使用教程
  6. goroutine sync.Mutex互斥锁Lock的使用
  7. vue组件的基本使用:入门示例
  8. python3安装venv虚拟环境
  9. 【收藏】Hadoop解决Could not locate executable null\bin\winutils.exe in the Hadoop binaries.问题
  10. Hadoop Yarn配置参数整理(非常全面)