派生类的初始化列表

Posted

技术标签:

【中文标题】派生类的初始化列表【英文标题】:Initializer List for Derived Class 【发布时间】:2015-10-13 00:00:51 【问题描述】:

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

为什么我可以这样做

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’

【问题讨论】:

【参考方案1】:

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

如果你能做你想做的事,那么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 新手(呃)的读者澄清一下——一个对象(大致)是一个类的实例,所以虽然你可以拥有同一个类的多个对象,但每个对象这些对象只能初始化一次。 @JasonMc92 int 也是 C++ 中的一个对象。对象是一个存储区域。 是的,我知道。我只是在说明一下。早在我学习 OOP 时,我曾经对“类”和“对象”感到困惑,所以我只是为这些群体提供了一点额外的清晰度。 :D【参考方案2】:

您需要一个基类构造函数来完成这项工作。你可以在这里寻找更多解释 -

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

【讨论】:

以上是关于派生类的初始化列表的主要内容,如果未能解决你的问题,请参考以下文章

2017.8.23

C++学习之路派生类的构造函数

虚函数总结

派生类:在初始化列表中使用基类成员

为啥我不能访问派生构造函数的成员初始化列表中继承的受保护字段?

C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?