c++ - 用户定义数据类型的大小和继承

标签 c++ inheritance

假设我们有以下代码:

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

相关文章:

c++ - 通过指针 vector 删除指针

c++ - 为什么从两个空类派生出来的空类的大小是2?

继承的Python类,什么都不做

c# - 使用 "new"隐藏继承接口(interface) : Is it a good idea? 中的基本成员

c++ - 在使用 C++ Square 类时遇到问题。成员函数实现和声明

c++ - 这是类型转换还是某种指针算法?

c++ - 是否有典型的模式来处理异常中的宽字符串?

c++ - 无法在 Visual Studio 2010 中的自引用对象中分配指针

java - 在Java中,我可以继承由类型参数提供的类吗?

Java继承子类和父类(super class)