C++ 派生类的初始值设定项列表

C++ 派生类的初始值设定项列表,c++,inheritance,constructor,polymorphism,initializer-list,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: pub

我想要一个派生类,它有一个初始化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();
}

错误:类“派生”没有任何名为“数据”的字段。

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

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

初始化与赋值不同。分配给
数据
没有问题:您只能初始化
数据
一次,但您可以分配给它任意多次

您可能需要为
base
编写一个构造函数,该构造函数为
数据
获取一个值

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
}

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


我会尽快澄清,对于一个对象来说,新的(ER)对象是(一个类)的实例,因此当你可以拥有同一个类的多个对象时,每个对象只能被初始化一次。@ Jason MC92,<代码> INT/COM>也是C++中的一个对象。对象是一个存储区域。是的,我知道。我只是想澄清一下。早在我学习面向对象编程时,我就常常混淆“类”和“对象”,所以我只是想让这些组更清晰一些D