2010-11-28 81 views
2
class Parent 

{ 
public: 
    int member; 

    Parent(): 
     member(0) 
    { 
    } 
}; 

class Child: 
    public Parent 
{ 
public: 
    Child(): 
     member(1) //error 
    { 

    } 
}; 

回答

1
class Parent 

{ 
public: 
    int member; 

    Parent(int m = 0): 
     member(m) // constructor takes an argument, default as 0 
    { 
    } 
}; 

class Child: 
    public Parent 
{ 
public: 
    Child(): 
     Parent(1) // refer to super class's constructor here 
    { 

    } 
}; 
+0

你打我吧:)雖然我的版本,我不改基類的公共接口 – 2010-11-28 19:13:29

+0

@阿門你的也很好。我不認爲我犯了罪,因爲班級的用戶不必更改他的代碼。這是開發人員的選擇。 – chrisaycock 2010-11-28 19:16:03

0

只需在函數體中使用member = 1;即可。

說明:初始化列表僅適用於類自己的字段(包括父類的構造函數)。除此之外,父類將首先被​​構造(因此當你的子類被構造時它的初始化列表已經被執行),所以你的代碼會再次構造成員,這是沒有意義的。

(來源:http://www.cplusplus.com/forum/general/29860/

0

初始化列表中是否有允許使用其它構造比默認的一個。顯然,一個Child構造函數不能選擇除Parent構造函數以外的任何東西來使用。所以兩個解決方案:

  • 添加一個構造函數家長做你想要的東西,使它的保護,如果需要
  • 簡單地添加在兒童構造的分配。
1

更改您的代碼:

class Child: 
    public Parent 
{ 
public: 
    Child() 
    { 
     member = 1; 
    } 
}; 

或嘗試:

class Child: 
    public Parent 
{ 
public: 
    Child():Parent(),member(1) 
    { 
    } 
}; 
6
class Parent{ 
private: 
    int member; 
public: 
    Parent(): 
     member(0){ 
    } 
protected: 

    explicit Parent(int x): 
     member(x){ 
    } 
}; 

class Child: 
    public Parent { 
public: 
    Child(): 
     Parent(1){ 
    } 
};