基类对象是否隐式添加到派生类中?
我刚刚阅读了标准中的子对象,他说:
子对象可以是成员子对象(9.2),基类子对象(子句10)或数组元素。
在阅读有关提及子对象的C ++时,在派生类中甚至没有子对象(明确定义)的情况下,我遇到过很多情况。
但是这是否意味着只要一个类有一个基类,编译器就会在派生类中隐式地添加一个基类类型的对象?
喜欢:
class Base
{
};
class Derived : Base
{
};
那么在Derived中添加了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]:
base-specifier-list指定包含在派生类类型的对象中的基类子对象的类型。 [例如:
struct Base {
int a, b, c;
};
struct Derived : Base {
int b;
};
struct Derived2 : Derived {
int c;
};
在这里,Derived2类的对象将具有Derived类的子对象,而该对象又将具有Base类的子对象。 - 结束示例]
术语子对象更普遍使用,因为继承不是形成聚合类型的唯一方法。 您可以将成员添加到类中,那些也将成为子对象。 当你形成数组时,每个元素都是数组的一个子对象。
为了解决您对这个问题的更新:
所以在上面的代码中,是anint
, afloat
的Base
对象的子对象?
是。 他们是Base
成员,因此是它的子对象。 它们的内存位置放置在Base
对象的内存中。
anint
和afloat
也是Derived
子对象吗?
是的,因为包含是传递性的。 Derived
包含Base
的子对象。
并且还在Derived
中添加了一个成员,它看起来像Base
?
Base
子对象没有名称成员。 Derived
对象内只有一块内存,其中包含一个Base
对象。
所以最后,Derived有三个子对象:anint,浮动和基地的东西?
是。 它看起来有点像这样:
+----------------------+
|+--------------------+|
|| int | float ||
|+--------------------+|
| Base object (unnamed)|
+----------------------+
Derived object
但是这是否意味着只要一个类有一个基类,编译器就会在派生类中隐式地添加一个基类类型的对象?
是。 这就是派生类是什么,以及访问该基本子对象的受保护成员,并且可以隐式转换为该基本子对象。
链接地址: http://www.djcxy.com/p/78947.html上一篇: Are base class objects implicitly added to derived classes?