Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用户定义的数据类型和继承的大小_C++_Inheritance - Fatal编程技术网

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

C++ 用户定义的数据类型和继承的大小,c++,inheritance,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; } 我得到的值是24,这意味着只需

假设我们有以下代码:

#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;
}
我得到的值是24,这意味着只需将此方法添加到结构D中,它的大小就翻了一番。我知道这是一个虚拟方法,但我不知道它是如何影响这个结构的大小的,考虑到这样一个事实,如果我从D中派生出一个类,它只会使多模态成为可能,这不是这里发生的事情。这里到底发生了什么?感谢您的帮助


现在,当我将这行代码添加到我的结构中时,虚拟函数和多态性可能会导致编译器向结构中添加编译器和特定于实现的隐藏数据。最常用的方法是使用一组函数指针。此表在结构本身中占用空间,通常是指针大小


考虑到您总共24个字节的例子,我猜您是在32位系统上,指针是4个字节(32位),因为12加4乘以3等于24。

虚拟函数和多态性可能会导致编译器向您的结构添加编译器和实现特定的隐藏数据。最常用的方法是使用一组函数指针。此表在结构本身中占用空间,通常是指针大小


考虑到你的例子,总共是24个字节,我想你是在一个32位系统上,指针是4个字节(32位),因为12加4乘以3等于24。

谢谢你的回答,但是,如果我有虚拟函数,我怎么知道类的大小呢,它的大小总是比我的大一倍,还是总是增加12个字节或其他什么?事实上,我使用64位Win7。但我是在网上编辑的compiler@cdummie继承层次结构中的每个类都将向对象添加自己的vtable,因此大小取决于有多少父类。如果您使用虚拟函数并且不知道有多少父类,那么您就不能使用
sizeof
来确定对象的大小。此外,结构(或类)的大小可能具有欺骗性,例如
std::string的
sizeof
不等于字符串的长度。基本上,如果我们忽略填充,我们可以说,对于每一个父类,我们在32位系统上有4个字节。@ cdmimie和一个用VTABLE实现的编译器。它的大小总是比我的大一倍,还是总是增加12个字节或其他什么?事实上,我使用64位Win7。但我是在网上编辑的compiler@cdummie继承层次结构中的每个类都将向对象添加自己的vtable,因此大小取决于有多少父类。如果您使用虚拟函数并且不知道有多少父类,那么您就不能使用
sizeof
来确定对象的大小。此外,结构(或类)的大小可能具有欺骗性,例如
std::string的
sizeof
不等于字符串的长度。基本上,如果我们忽略填充,我们可以说,对于每一个父类,我们在32位系统上有4个字节。@ cdmimie,以及一个用这种方式实现VTABLE的编译器。
virtual void f(){};