派生类的初始化列表

时间:2015-10-13 00:00:51

标签: c++ inheritance constructor polymorphism initializer-list

我希望有一个派生类,它有一个默认的构造函数,用于初始化inheirited成员。

为什么我可以这样做

class base{
protected:
 int data;
};

class derived: public base{
public:
 derived(){ //note
  data = 42;
 }
};

int main(){
 derived d();
}

但不是这个

class base{
protected:
 int data;
};

class derived: public base{
public:
 derived(): //note
  data(42){}
};

int main(){
 derived d();
}

error: class ‘derived’ does not have any field named ‘data’

2 个答案:

答案 0 :(得分:3)

对象只能初始化一次。 (例外情况是如果你初始化它然后销毁它;那么你可以稍后再次初始化它。)

如果您可以执行您尝试执行的操作,则base::data可能会初始化两次。 base的某些构造函数可能会初始化它(尽管在您的特定情况下它不会),然后derived构造函数会初始化它,可能是第二次。为了防止这种情况,该语言只允许构造函数初始化自己的类成员。

初始化与分配不同。分配到data没有问题:您只能初始化data一次,但您可以根据需要多次分配。{/ p>

您可能希望为base编写一个带有data值的构造函数。

class base{
protected:
 int data;
 base(int data): data(data) {}
};

class derived: public base{
public:
 derived(): base(42) {}
};

int main(){
 derived d{}; // note: use curly braces to avoid declaring a function
}

答案 1 :(得分:1)

您需要此作业的基类构造函数。你可以在这里寻找更多解释 -

Initialize parent's protected members with initialization list (C++)