大小虚拟继承中的派生类
sizeof derived class in virtual inheritance
在浏览虚拟基类时,我知道为了避免歧义并节省空间,我们使用虚拟基类。我用简单的程序检查了这个概念,如下面的代码块所示
#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。
有人请分析并帮助我...
看看 B 的代码大小是 12,C的大小是 12,所以 D 继承了 B 和 C 的所有内容,所以根据编译器和C++版本,它们中的大多数只是 D 的大小是 B+C 或即 24。但并非每个编译器都这样做,因此除非我们知道您的C++版本和编译器版本,否则我们无法得出任何结论,并且IDE也有很大的不同。
相关文章:
- 大小虚拟继承中的派生类
- 继承时如何构建派生类的变量?
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- "std::shared_from_this"不能由其派生类继承吗?
- 继承的数据如何在派生类中放置(排列)?
- C++具有空派生类对象的继承大小
- C++ 继承:基类中重载 operator+ 的 2 次在派生类中无法正常工作
- 如何调用继承的重载运算符<<并在派生类的输出中添加更多文本?
- 在模板派生类中继承具有类型别名的构造函数
- C++继承从基类指针访问派生类中的非虚拟函数
- C++排除通过派生类中的基类继承的类
- 派生类调用使用非继承成员的继承函数
- 多重继承中的派生类的行为类似于聚合
- 在派生类中具有相同签名但继承为受保护的函数
- 有没有办法调用基类函数,该函数在使用私有继承的派生类中被覆盖?
- 继承:动态派生类成员与静态派生类成员
- SIGSEGV 因为基/派生类的继承问题
- 从多重继承中的派生类函数调用适当的父类函数
- 继承函数是否适用于 C++ 中的基类元素或派生类元素?