如何在 C++ 子类的构造函数中初始化超类的 const 成员变量?
Posted
技术标签:
【中文标题】如何在 C++ 子类的构造函数中初始化超类的 const 成员变量?【英文标题】:How to initialise const member variable of superclass in constructor of subclass in C++? 【发布时间】:2015-03-10 10:59:08 【问题描述】:我有以下情况,我声明了一个超类的const
成员,现在我想在其子类之一的构造函数中初始化它列表初始化器。
struct Shape
public:
const Rect boundingRect; // the rect in which the shape is contained
;
struct Stain : Shape
public:
Stain(Rect boundingRect_) : boundingRect(boundingRect_)
;
我不确定这是否可能,如果我采用上面显示的直接方法,编译器会抱怨以下消息:
member initializer 'boundingRect' does not name a non-static data member or base class
This answer 解释了为什么不能在 子类的 构造函数的 list initiliazers 中初始化超类的成员变量。我想知道这种情况下的最佳做法是什么?
【问题讨论】:
【参考方案1】:您必须为struct Shape
添加一个构造函数并从您的子类中调用它。像这样:
struct Shape
public:
const Rect boundingRect; // the rect in which the shape is contained
Shape( Rect rect ) : boundingRecT( rect )
;
struct Stain : Shape
public:
Stain(Rect boundingRect_) : Shape (boundingRect_)
;
【讨论】:
【参考方案2】:这里只能初始化一个类的成员变量和基类(不能初始化基类的成员)。
解决方案是给Shape
一个接受初始化器的构造函数,例如:
Shape(Rect rect): boundingRect(rect)
Stain
像这样调用它:
Stain(Rect boundingRect_): Shape(boundingRect_)
如果您不希望公众使用此构造函数,您可以将其设为protected:
。
【讨论】:
以上是关于如何在 C++ 子类的构造函数中初始化超类的 const 成员变量?的主要内容,如果未能解决你的问题,请参考以下文章
C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量