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

Bor*_*ris 1 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;
    }
Run Code Online (Sandbox Code Playgroud)

为什么Circle_Impl在"Circle_Impl"错误中使用"未实现的纯虚方法'绘制' 实例化失败?" 还没有draw实现在被定义Shape_Impl???

Chr*_*odd 7

问题是你virtual在继承关键字时忘记Shape了纯虚方法draw:

class Circle : public virtual Shape { ...
class Shape_Impl : public virtual Shape { ...
Run Code Online (Sandbox Code Playgroud)

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