2013-04-12 22 views
4

我對類和超類共享字段有點困惑。我期待這是好的:C++:在類和超類之間共享字段

class SuperC { 
public: 
    SuperC(); 
protected: 
    double value; 
}; 

class C : public SuperC { 
public : 
    C(double value); 
}; 

SuperC::SuperC(){} 
C::C(double value):SuperC(),value(value){} 

但編譯器告訴我C沒有字段「值」。 C不會繼承SuperC中定義的那個?

許多THX

+0

哪個編譯器是的身體嗎? g ++(gcc 4.7.2)沒有任何抱怨(稱爲g ++ file.cpp) –

+0

mingw32-g ++。exe ...我也很困惑,因爲我非常確定我一直在使用我的系統進行上述操作(代碼塊在Windows8),我很驚訝地看到它不編譯。我必須錯過的東西。 – Vince

+0

嘿,我的壞 - 在粘貼我不知何故失去了構造函數的定義。傻我。 –

回答

8

它,但你只能初始化使用構造函數初始化列表語法當前類的成員。

您必須在SuperC中創建一個重載的構造函數,初始化value並調用它。

class SuperC { 
public: 
    SuperC(); 
    SuperC(double v) : value(v) {} 
protected: 
    double value; 
}; 

class C : public SuperC { 
public : 
    C(double value); 
}; 

SuperC::SuperC(){} 
C::C(double value):SuperC(value){} 
+0

我的猜測是每個類都負責初始化自己的成員,即使在繼承方案中,但我不確定我是否明白爲什麼需要這種行爲。你有什麼想法,這是在標準中說明? –

+0

@MihaiTodor基類首先被初始化,因此在之後(在SuperC的實際初始化過程中)初始化它的一個成員是沒有意義的。國際海事組織這是一個很好的電話,我可以想到一些錯誤,由於錯誤的論點和什麼。 –

+0

哦拍,是的,你是對的。感謝您指出了這一點! :) –

1

您無法在派生類的構造函數初始化列表中初始化基類成員。

fix1: 最大您可以通過將參數傳遞給BC來初始化派生類中的基類(BC)構造函數。

FIX2:指定基類成員在派生類的構造函數,而不是構造函數初始化列表

C::C(double value1):SuperC() 
{ 
     value = value1; 
} 
+0

@LuchianGrigore對不起。它的分配。 – shivakumar