基类对象是否隐式添加到派生类中?
Are base class objects implicitly added to derived classes?
我刚刚读到标准中的子对象是这样说的:
子对象可以是成员子对象 (9.2(,也可以是基对象 类子对象(子句 10(或数组元素。
我在阅读C++时遇到过很多情况,其中提到了子弹射,甚至在派生类中没有子对象(显式定义(。
但这是否意味着每当类具有基类时,编译器都会在派生类中隐式添加基类类型的对象?
喜欢:
class Base
{
};
class Derived : Base
{
};
所以在派生中添加了 Base 的子对象?
标准中有什么我应该阅读的内容吗?我知道这是一个非常小的报价。
更新:
如果我们有这些类:
class Base
{
int anint;
float afloat;
};
class Derived : Base
{
//inherited member variables...
};
那么在上面的代码中,anint
、afloat
Base
的子对象吗?anint
和afloat
也是Derived
的子对象吗?并且是否还向Derived
添加了看起来像Base something
的成员?所以最后,Derived
有三个子对象:anint
、afloat
和Base something
?
嗯,是的。派生最多的类将包含它派生自的每个类的子对象。引用C++17(n4659草案(,[class.derived/3]:
基说明符列表指定基类的类型 派生类类型的对象中包含的子对象。 [ 示例:
struct Base { int a, b, c; }; struct Derived : Base { int b; }; struct Derived2 : Derived { int c; };
在这里,类 Derived2 的对象将具有类的子对象 派生的,而它又将具有类 Base 的子对象。 — 完 示例 ]
术语子对象更普遍地使用,因为继承不是形成聚合类型的唯一方法。您可以向类添加成员,这些成员也将是子对象。当你形成数组时,每个元素都是整个数组的子对象。
要解决您对问题的更新,请执行以下操作:
那么在上面的代码中,
anint
、afloat
Base
的子对象吗?
是的。它们是Base
的成员,因此是它的子对象。它们的内存位置布置在Base
对象的内存中。
anint
和afloat
也是Derived
的子对象吗?
是的,因为包容是可传递的。Derived
包含一个子对象Base
。
并且是否还向
Derived
中添加了一个看起来像Base
成员?
Base
子对象没有命名成员。Derived
对象中只有一个内存块,其中包含构造了Base
对象。
所以最后,派生有三个子对象:anint,afloat和Base?
是的。它看起来有点像这样:
+----------------------+
|+--------------------+|
|| int | float ||
|+--------------------+|
| Base object (unnamed)|
+----------------------+
Derived object
但这是否意味着只要类具有基类,编译器就会在派生类中隐式添加基类类型的对象?
是的。这就是派生类,以及可以访问该基子对象的受保护成员,并隐式转换为该基子对象。
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 如何调用继承的重载运算符<<并在派生类的输出中添加更多文本?
- 基类对象是否隐式添加到派生类中?
- 添加来自派生类的对象
- 在派生类中添加虚拟说明符
- 将 final 关键字添加到没有基类(未派生)的类中的虚函数是否有意义
- 我想将超载运算符添加到派生类中
- 是否可以在不手动在C 中的每个派生类中添加覆盖的克隆方法来克隆多态对象
- 当我在派生类中添加额外的虚拟功能时,什么是开销
- C - 派生的class Off std :: String类以添加额外的功能
- 从std:string派生以添加typedefs和enum
- 即使在派生和添加宏后也无法连接
- 将派生对象添加到(抽象的)基指针数组中
- 添加派生类会导致重影错误
- 重新编译二进制类或派生类,以便在基类中添加新方法
- 在C++中,是否允许强制转换为仅添加非虚拟方法的派生类
- 将派生类变量添加到向量<BaseClass>
- C++03:向多个派生类添加字段
- C++继承,将成员添加到派生类并重新定义构造函数