纯虚拟函数和多重继承

Pure virtual functions and multiple inheritance

本文关键字:多重继承 函数 虚拟      更新时间:2023-10-16

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

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?(虚拟?纯?)我是否需要在中间层、中间层和上层实现(琐碎)?

问题:

我想在字母类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中添加虚拟成员函数以返回这些值是没有意义的。

问题:

我是否需要在中间层、中间层和高层实现(琐碎的)?

答案:

不,你没有。上一个问题的答案应该进一步澄清这一点。

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

没有必要在任何中间类中声明它,假设你很乐意它们保持抽象。它们从rock_bottom继承了纯函数,没有必要用另一个纯函数来覆盖它。