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

What is size of class while using inheritence?

本文关键字:多少 继承      更新时间:2023-10-16

嘿,当我使用继承时,我正试图理解类的大小是如何工作的,所以我写了以下代码:

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?

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

尽管我们并不总是这样认为,但sizeof在编译时计算它的值,而不是在运行时。所以你不妨把这个函数想象成这样:

virtual int getSize() {return 8;}

当继承到另一个类中时,您显然不会期望它发生变化。

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

  1. 类没有大小。对象有大小。

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

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

您从未覆盖BB中的getSize(),因此bb.getSize()调用AA::getSize()并返回bbAA部分的大小。要获得您期望的行为,您需要添加

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

在CCD_ 8中。


进行时要了解更多细节

bb.getSize()

它被翻译成BB::getSzie(bb)。因此,我们调用BB的函数getSzie(),并将要使用的对象传递给它。由于BB不覆盖getSize(),因此所选择的函数是AA::getSize()。因此,我们将bb传递给AA的函数。AA的函数版本采用AA&,因此在函数this中,即使我们给它一个BB,它的类型也是AA。这就是为什么它打印AA的大小。您必须将覆盖添加到BB中,这样当它调用函数时,this的静态类型为BB,然后您就可以获得BB的大小。