Cpp 对象模型探索 / 多重继承虚函数表分析
一、源码
#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()
二、分析
三、结论
- 对于继承了多个带有虚函数的父类的子类来说,该类有多个虚函数表,虚函数表的数量和父类的数量相同。
- 若子类存在虚函数,那么这些虚函数的地址会放在继承的第一个父类的虚函数表中,即:子类和第一个父类公用一个虚函数表,虚函数地址罗列顺序是虚函数声明顺序。
- 类对象有多个虚函数表指针,数量和父类的数量相同。这些虚函数表指针会依次放到子类对象的开始位置。
(SAW:Game Over!)
Cpp 对象模型探索 / 多重继承虚函数表分析相关推荐
- Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)
源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...
- Cpp 对象模型探索 / 含有虚基类的类的内存布局
一.栗子 class Grand { public:int i_grand_ = 8; };class Parent1 : public virtual Grand { public:int i_pa ...
- Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序
栗子 #include <iostream> class A { public:A() { std::cout << "A" << std::e ...
- Cpp 对象模型探索 / 系列文章的索引
一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...
- Cpp 对象模型探索 / 对象的虚函数表指针的位置
一.源码 #include <iostream>class A { public:virtual void func(){};public:int count_ = 0; };int ma ...
- Cpp 对象模型探索 / 虚函数表和虚函数表指针的创建时机
一.虚函数表 在编译期间创建.编译器会为每个类确定好虚函数表(vtbl)的内容. 二.虚函数表指针 虚函数表指针跟随着对象,在运行期间创建.由于在编译期间编译器为每个类创建好了 vtbl,并且编译器会 ...
- [C++对象模型][8]多重继承与虚函数表
一 多重继承 1) 代码: Code #include <iostream> using namespace std; class B1 { public: int x; ...
- 【C++】 C++虚函数表详细分析(上)
C++虚函数表详细分析 01. 目录 C++虚函数表详细分析 01. 目录 02. 虚函数表 03. 测试代码 04. 指针基础知识 05. _vptr 06. 结果分析 07. vptr. vtab ...
- 虚函数继承与虚函数表-汇编码分析
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 参考:https://www.equestionanswers.com/cpp/vptr-and-vta ...
最新文章
- 军哥lnmp一键安装包nginx支持pathinfo配置
- FM的调制matlab仿真
- js简单的设置快捷键,hotkeys捕获键盘键和组合键的输入
- Numpy实现BP神经网络(包含Dropout、BN等训练技巧)
- C++设计模式之三 单例模式
- Leetcode每日一题:1030.matrix-cells-in-distance-order(距离顺序排列矩阵单元格)
- XGBoost深度理解
- 【洛谷】【treap/堆】P2073 送花
- 在VScode中使用opencv,配置好了以后无法找到opencv2/opencv.hpp的问题
- plsql如何显示表结构图_plsql导出导入 表结构、表数据、存储过程等
- 搜索巨头百度深耕中国量子产业
- 【考研数学一】微分方程专讲(初步)
- 计算机每天定时开机设置方法,电脑如何设置每天定时开机
- Java关键字详解-配视频讲解链接(附带一些面试题)
- 人工智能编程语言介绍
- m基于matlab的PCM-FM码同步和GMSK的调制和解调方法,包括多符号检测MSD和Turbo编解码
- 如何快速高效出高质量效果图
- 再说说TCP和UDP源端口的确定
- LightningChart数据可视化工具图形控件教程51-BarSeries3D
- 真正可以免费使用的员工电脑监控软件
热门文章
- RHEL7.0 DNS服务配置
- LYNC2013部署系列PART10:后端高可用部署
- 你不得不知道的Visual Studio 2012(3)- 创建Windows应用程序
- 打造Ubuntu下的SLAMP
- 【蓝桥杯】Python自带编辑器IDLE的使用教程
- goroutine sync.Mutex互斥锁Lock的使用
- vue组件的基本使用:入门示例
- python3安装venv虚拟环境
- 【收藏】Hadoop解决Could not locate executable null\bin\winutils.exe in the Hadoop binaries.问题
- Hadoop Yarn配置参数整理(非常全面)