被简单的C ++多继承示例所困扰

时间:2018-01-23 17:33:59

标签: c++ inheritance multiple-inheritance

我一直在查看C ++核心指南项目C.129并复制粘贴了一个多继承示例,但无法弄清楚为什么MS编译器和CLang都会向我显示相同的错误。它必须非常简单!

代码:

    class Shape { // pure interface
    public:
        virtual void draw() = 0;
    };
    class Circle : public Shape { // pure interface
    public:
        virtual int radius() = 0;
    };

    class Shape_Impl : public Shape {
    public:
        void draw() override {}
    };
    class Circle_Impl : public Shape_Impl, public Circle {
    public:
        int radius() override { return 42; }
    };

    int main()
    {
        Circle_Impl* ic = new Circle_Impl();
        return 0;
    }

为什么Circle_Impl的实例化失败了"未实现的纯虚方法' draw'在' Circle_Impl'"错误? Hasn&#t; t draw实现已在Shape_Impl ???

中定义

3 个答案:

答案 0 :(得分:7)

问题是,在继承virtual时,您忘记了Shape关键字,该draw声明了纯虚方法class Circle : public virtual Shape { ... class Shape_Impl : public virtual Shape { ...

virtual

没有virtual关键字,您将获得重复的基本实例,从而导致错误的事情发生。通常,如果您希望通过多个继承链继承同一个类时需要多重继承,则需要{{1}}才能使其正常工作。

答案 1 :(得分:2)

您需要使用虚拟继承。没有它,您的类层次结构看起来大致如下:

Shape       Shape  <-- Two Shape instances, each requiring its own draw() implementation
  |           |
  |         Circle
  |           |
Shape_Impl    |
  |           |    <-- draw() not implemented in the right-hand branch
   \         /
   Circle_Impl

使用虚拟继承,它就是这样的:

     Shape     <- Single Shape instance, requiring only a single implementation of draw()
   /       \
  |         |
  |       Circle
  |         |
Shape_Impl  |
  |         |
   \       /
  Circle_Impl

要使用虚拟继承,只需在继承之前附加关键字virtual

class Circle : public virtual Shape
class Shape_Impl : public virtual Shape

答案 2 :(得分:1)

  

已在draw

中定义了Shape_Impl实施

它尚未在继承层次结构的Circle分支中实现。

你需要的是:

class Circle_Impl : public Shape_Impl, public Circle {
public:
    void draw() override { Shape_Impl::draw(); }
    int radius() override { return 42; }
};