纯虚函数和多重继承

时间:2015-02-25 15:52:06

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

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

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? (虚拟?纯粹?)我是否需要在中间层中间和更高层的(平凡)实现?

2 个答案:

答案 0 :(得分:2)

<强>问题:

  

我想在字母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或两者中实施这些功能。

但是,只有Rectangle具有长度和宽度。只有Ellipse具有主半径和小半径。在Shape中添加虚拟成员函数以返回这些值是没有意义的。

<强>问题:

  

我是否需要在中间层middle和up_up中实现(平凡)实现?

<强>答案:

不,你没有。上一个问题的答案应该澄清更多。

答案 1 :(得分:1)

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

没有必要在任何中级课程中声明它,假设你很高兴他们保持抽象。它们从rock_bottom继承了纯函数,并且没有必要用另一个纯函数覆盖它。