我一直在查看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
???
答案 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; }
};