繁体   English   中英

纯虚函数和多重继承

[英]Pure virtual functions and multiple inheritance

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

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? (虚拟的?纯的?)我是否需要在中间层中级和Higher_up的(简单的)实现?

题:

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

题:

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

回答:

不,你没有。 上一个问题的答案应对此进行更多说明。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM