C++多继承虚函数类内部模型结构剖析
来源:互联网 发布:insert into 跨数据库 编辑:程序博客网 时间:2024/05/29 13:46
这里主要看看C++在多继承含有虚函数的情况下类的内部成员结构和分布。
类继承体系代码如下,先看看非虚继承的情况:
class Base{public:Base(){}virtual ~Base(){}virtual void v(){}void f(){}public:int data_Base;};class Base1 : public Base{public:Base1(){}virtual ~Base1(){}virtual void v1(){}void f1(){}public:int data_Base1;};class Base2 : public Base{public:Base2(){}virtual ~Base2(){}virtual void v2(){}void f2(){}public:int data_Base2;};class Derived : public Base1, public Base2 {public:Derived(){}virtual ~Derived(){}virtual void v(){}virtual void v1(){}virtual void v2(){}virtual void v3(){}void f3(){}public:int data_Derived;};
使用VS2010提供的Command Prompt工具里的"cld1"命令查看类的结构如下:
由此可以看到,Derived类在内存里由低到高地址存储的分别是:
vfptr(虚函数表指针,包含Derived类新增的虚函数以及重写的或未重写的Base1基类的虚函数);
data_Base(Base基类的成员变量);
data_Base1(Base1基类的成员变量);
vfptr(虚函数表指针,包含Derived类重写的或未重写的Base2基类的虚函数);
data_Base(Base基类的成员变量);
data_Base2(Base2基类的成员变量);
data_Derived(Derived基类的成员变量);总共28个字节,以下是测试代码:
int main(void){Base1 base1;Derived derived;int *p1 = (int*)(&base1);int *p2 = (int*)(&derived);derived.data_Base1 = 3;derived.data_Base2 = 4;derived.Base1::data_Base = 1;derived.Base2::data_Base = 2;derived.data_Derived = 5;for (int i = 0; i < 10; i++){cout << hex <<p2<<":"<<hex<<*p2++ << endl;}cout << "derived size:" <<dec<< sizeof(derived) << endl;int a = 0;cin >> a;return 0;}
代码打印从Derived实例内存首地址开始的十个整形数据,结果如下:
与上面分析的一致,可以看出Derived包含了基类Base的两份数据,因此需要使用虚继承去掉公共基类的数据重复,加上虚继承后的类代码如下:
class Base{public:Base(){}virtual ~Base(){}virtual void v(){}void f(){}protected:float data_Base;};class Base1 : virtual public Base{public:Base1(){}virtual ~Base1(){}virtual void v1(){}void f1(){}protected:float data_Base1;};class Base2 : virtual public Base{public:Base2(){}virtual ~Base2(){}virtual void v2(){}void f2(){}protected:float data_Base2;};class Derived : public Base1, public Base2 {public:Derived(){}virtual ~Derived(){}virtual void v(){}virtual void v1(){}virtual void v2(){}virtual void v3(){}void f3(){}protected:float data_Derived;};
类结构分析结果如下:
由此可以看到,加上虚继承后Derived类在内存里由低到高地址存储的分别是:
vfptr(虚函数表指针,包含Derived类新增的虚函数以及重写的或为重写的Base1基类的虚函数);
vbptr(Base1基类指向公共基类成分部分的指针)
data_Base1(Base1基类的成员变量);
vfptr(虚函数表指针,包含Derived类重写的或未重写的Base2基类的虚函数);
vbptr(Base2基类指向公共基类成分部分的指针)
data_Base2(Base2基类的成员变量);
data_Derived(Derived基类的成员变量);vtordip(C++虚继承机制历史遗留的成员,始终为0);
vbptr(虚函数表指针,包含Derived类重写的或未重写的Base基类的虚函数);
data_Base(Base公用基类的成员变量)
总共40个字节,以下是测试代码:
int main(void){Base1 base1;Derived derived;int *p1 = (int*)(&base1);int *p2 = (int*)(&derived);derived.data_Base1 = 3;derived.data_Base2 = 4;derived.data_Base = 1;derived.data_Derived = 5;for (int i = 0; i < 10; i++){cout << hex <<p2<<":"<<hex<<*p2++ << endl;}cout << "derived size:" <<dec<< sizeof(derived) << endl;int a = 0;cin >> a;return 0;}
OK,与上面分析的一致。
- C++多继承虚函数类内部模型结构剖析
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- 【C++】虚函数在不同继承方式中的对象模型
- 剖析虚函数的内部实现机制
- 虚函数表以及单继承多继承对象模型
- Objectvie-C继承、新增类、内部函数调用、外部函数调用
- 多继承(非虚继承)派生类对象内存结构(基类有虚函数)
- C++虚函数对象模型剖析
- c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- c++单继承、多继承、菱形继承的内存布局(虚函数表结构)
- 深入探索c++虚函数继承模型
- 多继承(虚继承)派生类对象内存结构
- C++,继承、虚函数解惑!
- C++,继承、虚函数解惑!
- c++的结构体 继承 虚函数
- 剖析C++5种继承模型
- [C/C++]继承、多态和虚函数整理
- java两数之间互换
- Customers Who Never Order
- 使用xib创建的自定义UIView 无法进行交互
- Windows下安装RabbitMQ plugin mangement插件
- 百度UEditor编辑器关闭抓取远程图片功能(默认开启)
- C++多继承虚函数类内部模型结构剖析
- Java valitile 个人薄见
- 关于popwindow ListView 动画,点击其他地方消失
- GreenDao的简单使用及其介绍
- 【java】序列化
- C#多屏幕显示器编程
- 基于Ofbiz的Web框架
- 关于Chrome调试中.min.js.map 404的问题
- 右键旋转物体