Derived Class 的初始化列表

Initializer List for Derived Class

我想要一个派生的 class,它有一个初始化继承成员的默认构造函数。

为什么我可以这样做

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’

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

如果您可以做您想做的事情,那么 base::data 可能会被初始化两次。 base 的某些构造函数可能会初始化它(尽管在您的特定情况下它不会)然后 derived 构造函数将初始化它,可能是第二次。为了防止这种情况,该语言只允许构造函数初始化它自己的 class 的成员。

初始化不同于赋值。分配给 data 没问题:您只能初始化 data 一次,但您可以根据需要多次分配给它。

您可能想为 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
}

您需要一个基础 class 构造函数来完成这项工作。您可以在此处查找更多解释 -

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