派生类的初始化列表

Initializer List for Derived Class

本文关键字:列表 初始化 派生      更新时间:2023-10-16

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

为什么我可以这样做

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构造函数将初始化它,可能是第二次。为了防止这种情况,语言只允许构造函数初始化自己类的成员。

初始化不同于赋值。给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
}

这个工作需要一个基类构造函数。你可以在这里找到更多的解释-

用初始化列表初始化父级's受保护成员(c++)