[英]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.