蹲家宅宅 2023-10-24 21:25 采纳率: 52%
浏览 3

cpp虚继承中的类的内存占用为多少?

cpp虚继承中的类的内存占用为多少?


# include<iostream>

using namespace std;

class Base
{
private:
    /* data */
public:
    // Base(){
    //     m_Age = 0;
    //     cout << "Base" << endl;
    // };
    //~Base();
    int m_Age;
};

class Son1:virtual public Base
{
private:
    /* data */
public:
    // Son1(){
    //     m_Age = 10;
    //     cout << "Son1" << endl;
    // };
    //~Son1();
};

class Son2:virtual public Base
{
private:
    /* data */
public:
    // Son2(/* args */){
    //     m_Age = 20;
    //     cout << "Son2" << endl;
    // };
    //~Son2();
};

class Grandson:public Son1,public Son2
{
private:
    /* data */
public:
    // Grandson(/* args */){
    //     m_Age = 30;
    //     cout << "Grandson" << endl;
    // };
    //~Grandson();
};

int main(){
    Grandson g1;
    g1.m_Age = 100;
    //virtual后所有共享同一地址的属性,用虚指针指向(偏移量判断)
    cout << g1.m_Age << endl;
    

    cout << sizeof(Son1) << endl;
    cout << sizeof(Son2) << endl;
    cout << sizeof(Base) << endl;
    cout << sizeof(Grandson) << endl;


}

结果如下:(不太明白为什么)

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-25 09:21
    关注

    【以下回答由 GPT 生成】

    在C++中,虚继承是为了解决多继承中的二义性问题。虚继承会引入虚基类表(virtual base table),虚基类表中存储了虚基类的偏移量,用于解决多重继承中出现的同名虚基类的冲突问题。因此,在虚继承中,派生类会包含一个指向虚基类表的指针。

    根据上述代码,可以得到以下结论:

    1. Son1 类的内存占用为 4 bytes(在没有添加任何额外成员的情况下,由于继承了 virtual base class,会包含一个指向虚基类表的指针)。

    2. Son2 类的内存占用为 4 bytes(同理,继承了 virtual base class,包含一个指向虚基类表的指针)。

    3. Base 类的内存占用为 4 bytes(只包含一个 int 类型的成员变量 m_Age)。

    4. Grandson 类的内存占用为 20 bytes(由于虚继承,会包含一个指向虚基类表的指针,以及继承自 Baseint 类型的成员变量 m_Age)。

    要注意的是,由于虚继承引入了额外的开销,使得虚继承的内存占用相对较大。实际情况中,可以通过查看编译器的文档或使用 sizeof 运算符来获取各个类的确切内存占用大小。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月24日

悬赏问题

  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,
  • ¥15 spaceclaim模型变灰色
  • ¥15 求一份华为esight平台V300R009C00SPC200这个型号的api接口文档