【问题标题】:sizeof derived class in virtual inheritance虚拟继承中派生类的 sizeof
【发布时间】:2020-10-26 15:31:06
【问题描述】:

在浏览虚拟基类时,我知道为了避免歧义并节省空间,我们使用虚拟基类。我用简单的程序检查了这个概念,如下所示在 CodeBlocks

#include <iostream>
using namespace std;

class A
{
public:
    int a;
};

class B : public virtual A
{
public:
    int b;
};

class C : public virtual A
{
public:
    int c;
};

class D: public B, public C
{
public:
    int d;
};

int main()
{
    cout<<"sizeof(int) "<<sizeof(int)<<endl;
    cout<<"sizeof(A) "<<sizeof(A)<<endl;
    cout<<"sizeof(B) "<<sizeof(B)<<endl;
    cout<<"sizeof(C) "<<sizeof(C)<<endl;
    cout<<"sizeof(D) "<<sizeof(D)<<endl;
    return 0;
}

得到的输出为:

sizeof(int) 4
sizeof(A)   4
sizeof(B)   12
sizeof(C)   12
sizeof(D)   24

我理解前4行输出背后的逻辑,但我不明白为什么sizeof(D) 24, 它应该是 4(int d) + 4(int c) + 4(int b) + 4(int a) + 4(因为一些虚拟基指针) = 20。这里 'a' 只被继承一次 因为是虚拟基类,因此我应该得到 20 作为 sizeof(D) 但它是 24。

请有人分析并帮助我...

【问题讨论】:

  • “为了节省空间,我们使用虚拟基类”——真的吗?这就是现在虚拟基地的原因吗?我永远不会建议那个
  • 虚拟基类不是为了节省空间。在任何情况下,BC 都可能各自提供一个不同的“虚拟基址指针”,因为它们都有虚拟基址,并且从它们各自继承的所有类都需要能够始终如一地找到“虚拟基址”指针”。 D 继承自两者,因此两者都继承“虚拟基指针”——来自B 的一个和来自C 的一个(并且可能将它们初始化为等价,即指向相同的继承A)。
  • 4(由于一些虚拟基指针) - 是什么让您认为只需要一个? BC 都需要间接访问该子对象。
  • 你确定你得到了这些值吗?因为它没有在GodboltOnlineGDB 甚至我的中复制。

标签: c++ inheritance virtual sizeof


【解决方案1】:

看看 B 的代码大小是 12,C 的大小是 12,所以 D 继承了 B 和 C 的所有内容,因此取决于编译器和 C++ 版本,它们中的大多数只是 D 的大小是 B+C 或即 24 . 但并非每个编译器都这样做,所以除非我们知道您的 C++ 版本和编译器版本,否则我们无法得出任何结论,并且 IDE 也有很大的不同..

【讨论】:

    猜你喜欢
    • 2013-02-26
    • 2016-03-04
    • 2015-07-13
    • 1970-01-01
    • 2012-12-19
    • 2020-02-01
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多