对象的继承和大小
Inheritance and size of object
我假设我的基类有一个"int"成员,派生类也有一个"int"成员。现在,当我创建一个派生类对象并按sizeof(derivedClassObject)查看输出时,它变成了8。现在我很难理解这里的基本思想。
我知道,当我为派生类创建对象时,基类构造函数和派生类构造函数都会被调用。这里基类构造函数的唯一目的是初始化基类数据成员。我预计sizeof将显示4,因为我只对创建派生类对象感兴趣。但事实并非如此,我得到的输出是"8"。因此,额外的4字节正在被分配,我认为这是基类构造函数的情况。如果有人能帮助我掌握以下概念,我将不胜感激:
- 为什么在创建派生类对象时分配8个字节而不是4个字节?这是否意味着基类构造函数也在创建一个新的基类对象,并将其与新的派生类对象连接起来
我只创建了一个派生类对象,该派生类对象的大小为:sizeof(baseClassObject)+sizeof(derivedClassObject)。如果能得到一些帮助,我将不胜感激。
一般来说,oop中的inheritance
意味着派生类的对象也是基类的对象。因此,它包含基类包含的所有内容(在本例中为一个int,因此为4字节)以及派生类的任何其他数据成员(因此为另一个int)。
如果不是这样的话,派生类的对象怎么能用作基类的对象呢?继承的方法可能会做可怕的事情,因为它们试图访问的数据成员不存在。
因此sizeof(derivedClass)==sizeof(baseClass) + sizeof(int)
(尽管没有什么能阻止编译器将其变大)。
如果您不希望您的derivedClass
可用作baseClass
,则不应该从中派生。
假设您有两个类,如下
class Car {
int make;
public:
Car(int m): make(m) {}
int getMake() { return make; }
};
class Audi : public Car{
int internalID;
public:
Audi(int m, int id): Car(m), internalID(id){}
int getInternalID() { return internalID; }
};
现在我继续创建奥迪的对象
Audi *myCar = new Audi(2012 /*make*/, 216487 /*internal ID*/);
你可以做一些类似的事情
myCar->getInternalID(); //returns 216487
myCar->getMake(); //returns 2012
如果您假设创建派生类应该只为派生成员分配空间,那么在这种情况下,"make"将存储在哪里?
派生类只不过是派生类中声明的基类+成员。因此,你的派生对象在内存中看起来像这样
------------
| make |
------------
| internalID|
-------------
因此,您可以得到派生类成员的大小加上基类的大小。同样,基类的大小将是基类成员的大小加上基类的大小。希望这能有所帮助!
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 使用智能指针附加的继承对象的深层复制
- 虚拟类继承对象大小问题
- 基对象和继承对象,用于将标准变量包装在C++中
- 为什么私有继承对象允许成员函数将派生的*转换为基*,而外部不能
- 是否有一种方法可以专门使用继承对象的一般方法
- 如何将接口对象强制转换为特定的继承对象
- MFC C++ 无法在动态创建的 CButton 继承对象上设置映像
- 在容器中存储多个继承对象
- QObject基类到继承对象的C++类型转换
- C++ 中的继承对象和属性丢失
- 继承对象列表 - C++
- 静态分配继承对象的数组
- 正确实例化双重继承对象
- 我是否需要使用继承对象(相对于基对象)覆盖我的虚函数?
- c++继承.对象调用超类方法而不是自己的方法
- 基对象和继承对象的向量
- 将多继承对象转换为void*或从void*转换为多继承对象
- 如何在c++中表示继承对象的树?
- 继承对象上指针算术的安全性