假设我们有以下代码:
#include <iostream>
using namespace std;
struct A
{
int x =1;
};
struct B: public A{};
struct C: public A{};
struct D: public A{
B b;
C c;
};
int main()
{
cout<<sizeof(D);
return 0;
}
当我运行这个程序时,结果发现结构 D 的大小是 12,这就好像我有三种整数数据类型一样。考虑到 D 仅从结构 A 继承了一个 x,并且她自己的数据成员是以类似方式从 A 派生的类(准确地说是结构)的对象,这是有道理的。
但是,当我将下面这行添加到 D 类中的代码时
virtual void f(){};
我得到值 24,这意味着通过将此方法添加到结构 D 中,结构 D 的大小增加了一倍。我看到这是虚方法,但考虑到它只是使多态成为可能,以防我从 D 中派生出一个类,我看不到它如何影响这个结构的大小,这不是这里发生的事情.这里到底发生了什么?任何帮助表示赞赏!
现在,当我将这行代码添加到我的结构中时
最佳答案
虚函数和多态性可能会导致编译器将特定于编译器和实现的隐藏数据添加到您的结构中。最常见的方法是使用 virtual table (a.k.a. vtable)的函数指针。该表占用结构本身内部的空间,通常为指针的大小。
考虑到您总共 24
字节的示例,我猜您使用的是 32 位系统,其中指针为 4 个字节(32 位),因为 12 加 4 乘以 3 等于 24 .
关于c++ - 用户定义数据类型的大小和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57835179/