2010-11-28 80 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){ 
    } 
};