gpt4 book ai didi

c++ - 使用空类的虚拟继承

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:50 25 4
gpt4 key购买 nike

谁能说出以下 C++ 代码输出的确切原因?我收到的代码输出包含在标题注释中。和虚表、v指针有什么关系。

/* sizeof(Empty) 1                                                                                
sizeof(Derived1) 1
sizeof(Derived2) 8
sizeof(Derived3) 1
sizeof(Derived4) 16
sizeof(Dummy) 1
*/

#include <iostream>
using namespace std;

class Empty
{};

class Derived1 : public Empty
{};

class Derived2 : virtual public Empty
{};

class Derived3 : public Empty
{
char c;
};

class Derived4 : virtual public Empty
{
char c;
};

class Dummy
{
char c;
};

int main()
{

cout << "sizeof(Empty) " << sizeof(Empty) << endl;
cout << "sizeof(Derived1) " << sizeof(Derived1) << endl;
cout << "sizeof(Derived2) " << sizeof(Derived2) << endl;
cout << "sizeof(Derived3) " << sizeof(Derived3) << endl;
cout << "sizeof(Derived4) " << sizeof(Derived4) << endl;
cout << "sizeof(Dummy) " << sizeof(Dummy) << endl;
return 0;

}

最佳答案

首先,即使是没有成员的类也必须具有非零大小。该标准坚持这一点。否则,指针运算和数组将无法工作,因为大小为零的类的数组会将其所有元素都放在同一个位置!

其他大小不同的事实很可能是由于 v 表。但这在标准中没有明确规定,因此是您的编译器处理事物的方式的体现。

另请注意,多态性要求在基类中至少定义一个虚方法。这说明 sizeof(Derived1) 与基类大小相同。

关于c++ - 使用空类的虚拟继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31051486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com