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个虚表:

在这里插入图片描述

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

在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐