派生类的初始化器列表

5

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

为什么可以这样做?

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();
}

错误:类“derived”没有名为“data”的字段

2个回答

8
一个对象只能被初始化一次。(例外情况是如果你初始化它,然后摧毁它;然后你可以稍后再次初始化它。)
如果您能够做到您想要做的事情,那么 `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
}

我想为那些对面向对象编程(OOP)比较新的读者澄清一下 - 一个对象(大致上)是一个类的实例,因此虽然您可以拥有同一类的多个对象,但这些对象中的每一个只能被初始化一次。 - CodeMouse92
1
@JasonMc92 在C++中,int也是一个对象。对象是存储区域。 - Brian Bi
是的,我知道。我只是加上了那个澄清的注释。很久以前我学面向对象编程时,经常会混淆“类”和“对象”,所以我只是为那些群体提供了一点额外的明确性。 :D - CodeMouse92

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接