首页 > 试题广场 >

在32位系统中,下面程序打印结果为()#includeio

[单选题]
在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,24

不同编译器虚继承内存存取方式不同。GCC共享虚函数表指针,结果为D。VC在虚继承下不共享父类虚函数表指针,结果为B。

发表于 2019-10-14 12:34:28 回复(0)
这是结果,果然这个答案是错误的,我的vs版本2012
发表于 2019-09-14 00:11:15 回复(1)
这道题的答案在VS平台下选B,打印出A B C三个类的布局如下:
可以看出,虚继承的时候A B C三个类不仅不会共享虚基类指针,也不会共享虚表指针,要和普通继承区分开来
1> class A size(8):
1>      +---
1> 0    | {vfptr}
1> 4    | a
1>      | <alignment member> (size=1)
1>      +---
  
1> class B size(20):
1>      +---
1> 0    | {vfptr}
1> 4    | {vbptr}
1> 8    | b
1>      | <alignment member> (size=1)
1>      +---
1>      +--- (virtual base A)
1>12    | {vfptr}
1>16    | a
1>      | <alignment member> (size=1)
1>      +---
  
1> class C size(32):
1>      +---
1> 0    | {vfptr}
1> 4    | {vbptr}
1> 8    | c
1>      | <alignment member> (size=1)
1>      +---
1>      +--- (virtual base A)
1>12    | {vfptr}
1>16    | a
1>      | <alignment member> (size=1)
1>      +---
1>      +--- (virtual base B)
1>20    | {vfptr}
1>24    | {vbptr}
1>28    | b
1>      | <alignment member> (size=1)
1>      +---


编辑于 2019-08-21 16:01:15 回复(0)
这道题答案错误,对于虚继承  子类要虚继承父类,所以应该有一个指针,即正确答案为B
发表于 2019-08-20 22:23:49 回复(0)