【发布时间】:2010-05-06 07:57:18
【问题描述】:
如果您有 3 个类,箭头从父类指向子类(即“A -> B”表示“B 继承自 A”:
形状 -> 2d 形状 -> 圆形 +----> 3d 形状 -> 球体当您为 circle 类编写构造函数时,您是否会先初始化祖父 Shape 对象,然后再初始化当前对象,而跳过中间类?在我看来,您可以为 Shape 设置 x,y 坐标并在构造函数中初始化它们,并在圆形或球体类中初始化半径,但在 2d 或 3d 形状类中,我不知道在构造函数中放入什么因为它看起来与形状相同。这样的东西是否有效
Circle::Circle(int x, int y, int r) : Shape(x, y), r(r) {}
我得到一个编译错误:
illegal member initialization: 'Shape' is not a base or member
所以我不确定我的代码是否合法或最佳实践。或者,如果你想让中产阶级做顶级 Shape 类所做的事情
TwoDimensionalShape::TwoDimensionalShape(int x, int y) : Shape (x, y) {}
然后在 Circle 类中
Circle::Circle(int x, int y, int r) : TwoDimensionalShape(x, y), r(r) {}
【问题讨论】:
-
您需要显示类声明(不需要包含成员,但至少包含 decls 及其继承结构)。听起来您在 Circle 的声明中缺少 Shape 的子类化。
标签: c++ inheritance constructor