首页 > 试题广场 >

下面程序打印结果为()#includeus...

[单选题]
32位系统中下面程序打印结果为()
#include<iostream>
using namespace std;

class A
{
char a[3];
public:
virtual void fun1(){};
};

class B : public virtual A
{
char b[3];
public:
virtual void fun2(){};
};

class C : public virtual B
{
char c[3];
public:
virtual void fun3(){};
};

int main ()
{
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
return 0;
}


  • 4,20,28
  • 8,20,32
  • 4,12,20
  • 8,16,28
被牛客网弄傻了。这题牛客网题库中不仅重复收录了,而且还有两种不同的答案。一种答案是B,一种答案是D。
实际上编译器不同答案不同,GCC编译器中在派生类虚继承基类时,即使派生类中有自己的虚函数或没有全覆盖基类的虚函数,此时派生类和基类也共享同一个指向虚函数的指针。
sizeof(A)=8没有争议。
在VS编译器下:
sizeof(B) = sizeof(A) + 4(char[b3]的大小) + 4(指向虚继承的父类的指针大小) + 4(因为是虚继承所以有指向自己的虚函数表的指针大小) = 20
sizeof(C) = sizeof(B) + 4(char[c3]的大小) + 4(指向虚继承的父类的指针大小) + 4(因为是虚继承所以有指向自己的虚函数表的指针大小) = 32
在GCC编译器下:
因为gcc不管是否是虚继承,父类和子类都共享同一个指向虚函数的指针,所以:
sizeof(B) = sizeof(A) + 4(char[b3]的大小) + 4(指向虚继承的父类的指针大小) = 16
sizeof(C) = sizeof(B) + 4(char[c3]的大小) + 4(指向虚继承的父类的指针大小) = 24
编辑于 2019-09-06 09:05:11 回复(1)
打印出来结果是8 16  24
所以是什么鬼

发表于 2019-08-27 09:56:18 回复(2)
发表于 2019-09-04 21:37:51 回复(0)