c++ - 虚拟继承中派生类的大小

标签 c++ sizeof virtual-inheritance memory-layout vptr

#include "stdafx.h"
#include <iostream>
using namespace std;

class ClassA
{
    protected:
       int width, height;
    public:
       void set_values(int x, int y)
       {
         width = x;
         height = y;
       }
};

class ClassB : virtual public ClassA
{
   //12(int + int + vptr)
};

class ClassC : virtual public ClassA
{
  //12(int + int + vptr)
};

class ClassD : public ClassB, public ClassC
{
};

int main()
{
  ClassA A;
  ClassB B;
  ClassC C;
  ClassD D;
  cout << "size = " << sizeof(A) << endl;
  cout << "size = " << sizeof(B) << endl;
  cout << "size = " << sizeof(C) << endl;
  cout << "size = " << sizeof(D) << endl;
  return 0;
}

我得到的输出是:

size of ClassA = 8
size of ClassB = 12
size of ClassC = 12
size of ClassD = 16

在上面的代码中,为什么 ClassD 的输出是 16。请向我解释清楚这种虚拟继承是如何工作的。

最佳答案

虚拟继承意味着虚拟基类只存在一次,而不是多次。这就是为什么来自 ClassA 的 8 个字节只在 ClassD 中出现一次。虚拟继承本身需要一定的开销,因此您会得到一个额外的指针。 C++ 标准未指定确切的实现以及因此而产生的确切开销,并且可能会因您创建的层次结构而异。

关于c++ - 虚拟继承中派生类的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15335093/

相关文章:

c++ - 关于虚拟继承层次结构的问题

c++ - char * 加一个数的结果是什么?

c++ - 当参数声明为 const 时,为什么重载的 operator> 不起作用?

C++ 继承 : Calling constructor w/args

c++ - C 数组的大小作为函数?

c - 在这种情况下,C 是否正确处理了 sizeof(...) 和 sizeof ...?

python - dlib 构建失败,无法导入 dlib

c++ - sizeof运算符为VOID运算符返回1个字节

c++ - "Marked as override but does not override"OOP代码问题

c++ - 在多继承场景下使用虚基类时,是不是所有的派生类都需要引用虚基类?