c++ - 被简单的 C++ 多重继承示例难住了

标签 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’ in 'Circle_Impl'”错误? Shape_Impl中不是定义了draw实现吗???

最佳答案

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

class Circle : public virtual Shape { ...
class Shape_Impl : public virtual Shape { ...

如果没有 virtual 关键字,您会得到重复的基础实例,这会导致错误的事情发生。一般来说,如果您想要多重继承,而您可能会通过多个继承链继承同一个类,则需要 virtual 才能使其正常工作。

关于c++ - 被简单的 C++ 多重继承示例难住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48407658/

相关文章:

c++ - 重载运算符中的类型不匹配(编写管道)

c++ - 如何使 WS_THICKFRAME 不可见,但在 MFC 中仍然起作用?

c++ - 多层次抽象类

java - Java中的多重继承即使类继承了Object

c++ - 实现具有多重继承的纯虚函数

C++ 文件选择窗口

c++ - 在我的 C++ 链表实现中取消引用节点指针给出了意想不到的结果

java - 迭代继承的类对象的列表

c# - 如果源代码可用而不是继承,为什么要使用扩展方法

c++ - 将对象转换为其基数的子集