【问题标题】:Pure virtual functions and multiple inheritance纯虚函数和多重继承
【发布时间】:2015-02-25 15:52:05
【问题描述】:

我有一个(保证树形的)级联类,例如

class rock_bottom {
    ...
    virtual foo() = 0;
};

class A : rock_bottom {...}

class intermediate: rock_bottom {...}   

class B : intermediate {...}

class higher_up {...}

class C : higher_up {...}

我想在字母类 A、B、C 中实现 foo()。我需要在哪里声明 foo? (虚拟的?纯粹的?)我需要在中间层intermediate 和higher_up 中(微不足道的)实现吗?

【问题讨论】:

  • 如果它是纯虚拟的,则需要在派生自rock_bottom 的每个非抽象类中实现它。否则,你不能。
  • 您必须使用相同的签名来实现(虚拟是可选的)。
  • @Aleph:不是每个班级。只是那些你想成为非抽象的(或那些直接或间接的基类)。
  • @MikeSeymour 你当然是对的,请原谅我的不精确。
  • higher_up 是否应该派生自其他类之一?正如发布的那样,C 没有任何东西可以覆盖。

标签: c++ multiple-inheritance pure-virtual


【解决方案1】:

问题:

我想在字母类A、B、C中实现foo(),我需要在哪里声明foo? (虚拟?纯?)

答案:

这个问题需要反过来问。在哪个基类中创建接口foo 有意义。让我们学习一些你可能会在应用程序中找到的类。

struct Shape {};
struct Rectangle : public Shape {};
struct Square : public Rectangle {};
struct Ellipse : public Shape {};
struct Circle : public Ellipse {};

所有Shape 都能够返回他们的面积和周长是有道理的。所以你把它们作为virtual的成员函数放在Shape中。

struct Shape 
{
   virtual double area() const = 0;
   virtual double perimeter() const = 0;
};

在创建Shape 子类型的实例之前,您必须实现它们。

如果您希望能够创建Rectangle,则这些功能必须在Rectangle 中实现,因为没有其他中间类。

如果您希望能够创建Square,则必须在RectangleSquare 或两者中实现这些功能。

同样,如果你想创建一个Ellipse,这些功能必须在Ellipse中实现,因为没有其他中间类。

如果您希望能够创建Circle,则必须在EllipseCircle 或两者中实现这些功能。

但是,只有Rectangles 有长度和宽度。只有Ellipses 有大半径和小半径。在Shape 中添加虚成员函数来返回这些值是没有意义的。

问题:

我需要在中间层intermediate 和higher_up 中实现(微不足道的)吗?

答案:

不,你没有。上一个问题的答案应该更清楚地说明这一点。

【讨论】:

    【解决方案2】:

    每个覆盖都需要在实现它的类中声明;在您的情况下,ABC,因为您说每个都会提供覆盖。

    假设您对它们保持抽象感到高兴,则无需在任何中间类中声明它。他们从rock_bottom 继承了纯函数,用另一个纯函数覆盖它是没有意义的。

    【讨论】:

      猜你喜欢
      • 2012-01-31
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 2010-10-02
      • 2015-08-07
      • 2018-10-09
      相关资源
      最近更新 更多