#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/