首页 > 试题广场 >

以上代码使用VC编译成32位可执行程序,请问:nLenA、n

[单选题]
class t_classA {
public:
    t_classA() {};
    ~t_classA() {};
};

class t_classB {
public:
    t_classB() {};
    virtual ~t_classB() {};
};

class t_classC : public t_classA, public t_classB {
public:
    t_classC() {};
    virtual ~t_classC() {};
};

int nLenA = sizeof(t_classA);
t_classA oA;
int nLenAObject = sizeof(oA);

int nLenB = sizeof(t_classB);
t_classB oB;
int nLenBObject = sizeof(oB);

int nLenC = sizeof(t_classC);
t_classC oC;
int nLenCObject = sizeof(oC);

请问:nLenAnLenAObjectnLenBnLenBObjectnLenCnLenCObject的值(32位机器)分别为()

  • 1,1,4,4,8,8
  • 0,0,4,4,4,4
  • 0,0,4,4,8,8
  • 1,1,4,4,4,4
根据网上相关资料整理,供大家学习。 
 C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1,所以nLenA和nLenAObject的值为1; 
如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键。因此,LenB和nLenBObject的值为4;
 对于普通继承,派生类和基类共享虚函数指针,派生类对象的存储空间=基类存储空间+派生类特有的非static数据成员的空间,由于t_classA为空类,t_classB和t_classC共享虚函数指针,因此LenC和nLenCObject的值为4;
编辑于 2017-08-15 15:57:03 回复(8)
C++中只有构造函数和析构函数或其成员函数时所占内存为1(不含虚函数),带有虚函数的时候内存为4,普通继承都是公用一张虚函数表,指针大小不增加。(当然有成员变量要加上成员变量的内存)
发表于 2017-08-11 14:50:06 回复(0)
nLenA = sizeof(t_classA) ,t_classA中只有一个构造函数和一个析构函数,所以大小为1。
nLenAObject=sizeof(oA),oA是实例化后的对象,也只有一个构造函数和一个析构函数,所以大小为1。
nLenB = sizeof(t_classB),t_classB中的析构函数是一个虚函数,编译器会设置一个指针来指向虚函数表vtable,这个指针实际是个地址,在32位机器上就是4字节,所以,大小为4.
nLenBObject也是4。
t_classA为空类,t_classB和t_classC共享虚函数指针,因此LenC和nLenCObject的值为4;
发表于 2018-07-11 10:40:56 回复(0)
#include <iostream>
using std::endl;
using std::cout;

class Base1 {
public:
    virtual ~Base1() {};
};

class Base2 {
public:
    virtual ~Base2() {};
};

class Derived : public Base1, public Base2 {
public:
    virtual ~Derived() {};
};

int main(void)
{
    cout << sizeof(Derived) << endl;

    return 0;
}
结果明明就是 8(vs2008和g++结果一致)
多继承时,每个父类都有自己的虚表。子类新增的的虚函数被添加到了第一个父类的虚表后面。怎么就共享虚函数表指针了?
编辑于 2017-09-07 11:39:03 回复(7)
空类大小为1,空类实例化对象大小也为1
声明虚函数增加一个指向虚函数表(实现多态)的指针,不论几个虚函数都是只有一个指针
发表于 2022-03-14 09:17:10 回复(0)
存在一个虚函数表指针
发表于 2023-09-13 21:38:04 回复(0)
增加一个虚函数, 只是简单地向该类对应的虚函数表中增加一项而已, 并不会影响到类对象的大小以及布局情况
发表于 2023-03-24 21:13:01 回复(0)
实际运行,最后2个是8吧,求大神解答!
发表于 2022-06-07 18:27:54 回复(0)
<p>不妨考虑一下虚继承?</p>
发表于 2020-04-23 20:24:05 回复(0)

所以到底是4还是8

发表于 2019-08-25 14:27:15 回复(0)
冷门知识:(没考虑到)  C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1,(一个字节8位,32位4个字节)
编辑于 2019-05-09 22:12:41 回复(0)
因A为空类,故B和C共享虚表指针,所占字节数为4,选D。
编辑于 2018-11-29 16:29:19 回复(0)
我想问下   因为就是普通的继承啊  为什么不是 A+B的内存空间大小=C啊??
发表于 2018-07-24 22:17:42 回复(2)
最后的两个答案选4,我认为原因是:两个虚析构函数,共用一个虚函数表指针吧
发表于 2018-03-23 20:46:49 回复(1)
“请问:nLenAnLenAObjectnLenBnLenAObjectnLenCnLenCObject的值分别为(    )”是nLenAnLenAObjectnLenBnLenB.........
发表于 2017-08-13 16:05:12 回复(0)
http://123.207.162.53/archives/61处有说明
发表于 2017-08-10 23:45:41 回复(0)