簡體   English   中英

C ++使用派生類構造函數填充受基類保護的成員

[英]C++populating base class protected member using derived class constructor

我有這樣的事情:

Class Base
{
  public:
    Base();
  protected:
    someType myObject;
}

Class Child:public someNamespace::Base
{
   //constructor
   Child(someType x):myObject(x){}
}

子類和基類位於2個不同的命名空間中...編譯器抱怨我的子類沒有名為myObject的字段

有人知道為什么嗎? 是因為從Child構造函數中填充Base成員是非法的嗎?

謝謝

您不能像這樣初始化繼承的成員。 相反,可以給基類一個構造函數來初始化該成員,然后派生類可以調用該構造函數。

class Base
{
  public:
    Base(someType x) : myObject{x} {}
  protected:
    someType myObject;
}

class Child : public Base
{
  public:
    //constructor
    Child(someType x) : Base(x) {}
}

通常,一個類應該負責初始化其自己的成員。

這里的問題是您正在初始化列表中初始化繼承的myObject 創建派生類的對象時,在進入派生類的構造函數的主體之前,將調用基類的構造函數(默認情況下,如果基類具有默認或沒有參數構造函數,否則必須顯式調用初始化列表中的構造函數)

因此,當執行:: Class Child:public someNamespace::Base ,尚未調用基類的構造函數,這就是編譯器抱怨的原因:: 子類沒有名為myObject的字段 ,也就是說,您實際上是試圖給尚未聲明和定義的值賦值! Base類的構造函數進入其執行之后,將對其進行定義。

因此,您的Child類構造函數將如下所示:

   Child(someType x) {
      myObject = x;
   }

工作ideone鏈接:: http://ideone.com/70kcdC

我發現以上答案中缺少這一點,因此我認為這可能實際上有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM