继承时派生类的变量是如何构建的?

Posted

技术标签:

【中文标题】继承时派生类的变量是如何构建的?【英文标题】:How the variables of derived class are built when inheriting? 【发布时间】:2020-06-30 13:43:41 【问题描述】:

继承时,基类中的变量是否会复制到派生类中?子类的架构会是怎样的?


public:
 int m_id;

 Base(int id=0)
     : m_id(id)
 
 

 int getId() const  return m_id; 
;

class Derived: public Base

public:
 double m_cost;

 Derived(double cost=0.0)
     : m_cost(cost)
 
 

 double getCost() const  return m_cost; 
;

派生对象的实例化m_id会被复制到派生中吗?

【问题讨论】:

没有任何东西被“复制”到任何地方。基类是派生类的一部分。 这能回答你的问题吗? C++: Construction and initialization order guarantees @underscore_d 是的,它很有用,但我仍然没有得到适当的答案,谢谢 【参考方案1】:

派生类 (Derived) 并不是严格意义上的复制基类 (Base)。 Derived 继承自 Base,因此 BaseDerived 的一部分。想想Derived 用新方法和新成员扩展Base

在您的示例中,Base 具有默认构造函数,因为第一个参数是可选参数(Base(int id=0),您可以在不带任何参数的情况下调用构造函数来将 id 设置为 0)。

当您使用继承时,Derived 必须始终在执行任何其他操作之前在Derived 的构造函数中调用Base 的构造函数(以确保初始化Base 的变量)。然而,因为Base 有一个默认构造函数,编译器会很神奇地让它成为可选的。

如果您想从Derived 的构造函数中调用特定的Base 的构造函数,您可以执行以下操作:

Derived(double cost=0.0) : Base(1 /* or whatever you want it to be */)

  m_cost = cost;

【讨论】:

那么 Derived 类如何与基础部分一起存储在内存中?因为在 Derived 对象实例化时,如果您尝试在其构造函数中打印对象 Base 的地址(std::cout @slahOmar 它们是同一个对象,所以它们当然有相同的地址。为简化起见,基本成员基本上存在于内存中派生成员的“上方”,但它们是派生对象的一部分。

以上是关于继承时派生类的变量是如何构建的?的主要内容,如果未能解决你的问题,请参考以下文章

4月14日继承与多态

继承与派生

C++基类和派生类的构造函数

C++入门派生类和基类的构造/析构函数关系

5继承与派生2-访问控制

继承和派生