C++多重继承及虚继承内存结构
·
C++继承的内存分布
继承多个类
定义基类base1和base,定义子类derived继承base1和base2。
#include <iostream>
using namespace std;
class base1
{
public:
int a;
virtual void base1_func()
{
cout << "base1_func" << endl;
}
};
class base2
{
public:
int b;
virtual void base2_func()
{
cout << "base2_func" << endl;
}
};
class derived : public base1, public base2
{
public:
int c;
virtual void derived_func()
{
cout << "derived_func" << endl;
}
};
int main(int argc, char** argv)
{
derived d;
return 0;
}
使用gcc进行编译:
gcc testshit.cpp -o testshit -g -lstdc++ -O0
使用gdb进行调试,使用set print pretty on打开打印美化,使用info vtbl &d显示derived类对象d的虚表:

发现base1的虚表和derived的虚表合并了,derived新增的虚函数derived_func附在base1::base1_func的后边;base2单独成表。
打印首地址:

可见强制类型转换就是将对应的父类指针进行赋值。
虚继承
增加baseofbase并修改base1和base2:
class baseofbase
{
public:
int base;
virtual void baseofbase_func()
{
cout << "baseofbase_func" << endl;
}
};
class base1: virtual public baseofbase
{
public:
int a;
virtual void base1_func()
{
cout << "base1_func" << endl;
}
};
class base2: virtual public baseofbase
{
public:
int b;
virtual void base2_func()
{
cout << "base2_func" << endl;
}
};
编译后依然使用gdb调试,打印d的虚表:

发现对象在末尾才增加了一个祖父类,并且有唯一的1个虚表:

那么虚继承类对象的内存分布就如图:

更多推荐


所有评论(0)