首页 > 试题广场 >

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

[单选题]
下面程序打印结果为()
#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
对于class A 来说 char a[3] 占3个字节,由于对齐,总共占4个字节,由于类中存在一个虚函数virtual void fun1(){};  编译器会自动生成一个虚函数表存放虚函数指针,故而这个虚函数指针占用4个字节,总共占8字节。对于class B而言,由于B是通过虚继承class B : public virtual A 定义的,所以编译器会生成一个虚继承指针,占4个字节;继承的A类8个字节自然也继承了;char [3]占3个字节,由于对齐,占4个字节;同时,B中含有自己的虚函数(注:当通过虚继承方式继承类,那么基类和子类各自用自己的数函数表),编译器又给B生成了一个虚函数表和虚指针,占4个字节。故而B类总共占4+8+4+4 = 20;以此类推class C比classB多12字节。
发表于 2019-09-15 11:25:35 回复(0)

c++的编译器编译器一旦发现一个类型中有虚函数,就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数的指针。在32位机器上,一个指针占4字节空间。当我们声明空类型时,它必须在内存中占有一定的空间,在vs中,空实例占用一字节空间。

编辑于 2019-08-20 15:03:15 回复(0)
为啥不是8,16,24??
发表于 2019-08-30 20:51:15 回复(1)
自己总结的
C++ sizeof(类)
  • 空类:1
  • 只带有成员函数:1 (类的大小与成员函数,构造函数,析构函数无关)
  • 数据成员:字节补齐
  • 类继承:子类=子类+父类
  • 虚函数:加一个指针vptr
  • 静态成员:不影响大小
  • 虚继承:普通继承+指针vptr 
发表于 2019-10-11 17:41:53 回复(0)
为啥用C++11得到的结果是8,16,24
发表于 2019-10-09 16:31:43 回复(0)