使用继承权时,类的大小是多少?

时间:2017-07-21 18:23:48

标签: c++ class inheritance virtual-functions

嘿我正在尝试了解当我使用继承时类的大小如何工作,所以我写了这段代码:

class AA 
{
public :
    int a;
    virtual int getSize() {return sizeof(*this);}   
};

class BB : public AA
{
public :
    int b;  
    virtual int getSize2() {return sizeof(*this);}
};

int _tmain(int argc, _TCHAR* argv[])
{
    AA aa;
    BB bb;
    std::cout << "Class AA : " << aa.getSize() << std::endl;
    std::cout << "Class BB : " << bb.getSize() << std::endl;
    std::cout << "Class BB : " << bb.getSize2() << std::endl;
}

此代码的输出为:

Class AA : 8
Class BB : 8
Class BB : 12

我的问题是:为什么第二个输出返回AA的大小而不是返回BB的大小? bb是BB型,所以我期待12而不是8?

3 个答案:

答案 0 :(得分:3)

virtual int getSize() {return sizeof(*this);}

虽然我们并不总是这样想,但sizeof在编译时计算其值,而不是运行时。所以你不妨把这个函数想象成这样:

virtual int getSize() {return 8;}

当你继承到另一个班级时,你显然不希望改变。

确保派生类返回正确值的方法是确保它们使用各自类的大小覆盖此函数。

答案 1 :(得分:2)

  1. 课程没有规模。对象有大小。

  2. getSize()只知道A类对象的大小。

  3. getSize2()只知道B类对象的大小。

答案 2 :(得分:2)

您永远不会覆盖getSize()中的BB,因此bb.getSize()来电AA::getSize()并返回bb AA部分的大小。要获得您期望的行为,您需要添加

int getSize() {return sizeof(*this);}
BB中的

进行更多细节

bb.getSize()

这会转换为BB::getSzie(bb)。因此,我们调用BB函数getSzie(),然后将其传递给要使用的对象。由于BB不会覆盖getSize(),因此选择的函数为AA::getSize()。因此,我们将bb传递给AA的功能。 AA该函数的版本需要AA&,因此函数this中的AA类型为BB,即使我们给它AA。这就是它打印BB大小的原因。您必须将覆盖添加到this,以便在调用函数时BB的静态类型为BB,然后您可以获得cucumber js的大小