【问题标题】:Constructors with inheritance in c++C++中具有继承的构造函数
【发布时间】: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


【解决方案1】:

是的,正如您在帖子末尾指出的那样,您的类构造函数只能调用其直接父级的构造函数,您不能“跳过”类并初始化您父级的父级。

【讨论】:

    【解决方案2】:

    对于非虚继承,只能调用父类的构造函数。

    您构建祖父母(或曾祖父母等)的唯一情况是使用虚拟继承。

    【讨论】:

      【解决方案3】:

      Shape2d 类的构造函数应该调用 Shape 的构造函数。 Circle 的构造函数应该调用 Shape2d 的构造函数。

      【讨论】:

        猜你喜欢
        • 2015-01-17
        • 1970-01-01
        • 1970-01-01
        • 2017-08-09
        • 1970-01-01
        • 1970-01-01
        • 2019-01-21
        • 1970-01-01
        • 2015-06-09
        相关资源
        最近更新 更多