使用继承时,类的大小是多少
What is size of class while using inheritence?
嘿,当我使用继承时,我正试图理解类的大小是如何工作的,所以我写了以下代码:
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;}
当继承到另一个类中时,您显然不会期望它发生变化。
确保派生类返回正确值的方法是确保它们用各自类的大小覆盖此函数。
-
类没有大小。对象有大小。
-
getSize()只知道类型A的对象的大小。
-
getSize2()只知道B类型对象的大小。
您从未覆盖BB
中的getSize()
,因此bb.getSize()
调用AA::getSize()
并返回bb
的AA
部分的大小。要获得您期望的行为,您需要添加
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
的大小。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 复制列表初始化的隐式转换的等级是多少
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- while循环中while循环的时间复杂度是多少
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 如何检查一个c++字符串中有多少相同的字符/数字
- 公共与私人继承
- C++有多少类型的循环
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 使用继承时,类的大小是多少
- 如果一类继承nsobject,则放置多少开销