派生类的初始化列表
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 新手(呃)的读者澄清一下——一个对象(大致)是一个类的实例,所以虽然你可以拥有同一个类的多个对象,但每个对象这些对象只能初始化一次。 @JasonMc92int
也是 C++ 中的一个对象。对象是一个存储区域。
是的,我知道。我只是在说明一下。早在我学习 OOP 时,我曾经对“类”和“对象”感到困惑,所以我只是为这些群体提供了一点额外的清晰度。 :D【参考方案2】:
您需要一个基类构造函数来完成这项工作。你可以在这里寻找更多解释 -
Initialize parent's protected members with initialization list (C++)
【讨论】:
以上是关于派生类的初始化列表的主要内容,如果未能解决你的问题,请参考以下文章