考虑以下层次结构:
class Interface {
public:
virtual void foo() = 0;
};
class SubInterface: public Interface {
public:
virtual void bar() = 0;
};
class Base: public Interface {
public:
void foo() {};
};
class Impl: public SubInterface, public Base {
public:
void bar() {};
};
这是一个模拟如何使用这些类的例子:
int main() {
SubInterface* view1 = new Impl(); // Error! Interface::foo() is pure virtual within Impl
view1->foo();
view1->bar();
Interface* view2 = view1;
view2->foo();
}
为什么编译器不能看到Interface::foo()
Base
中Impl
继承了foo()
?
我认为我可以明确地在Impl
中实施Base
并将调用委托给class Impl: public SubInterface, public Base {
public:
void foo() {
Base::foo();
}
void bar() {};
};
,如下所示:
{{1}}
但是,对于实现子接口的所有类,我必须这样做,所以这种方式并不完全理想。有更好的解决方案吗?
答案 0 :(得分:5)
SubInterface
和Base
应该从Interface
虚拟继承,否则您会以dreaded diamond的形式创建歧义
基本上,会发生的是Impl包含两个“实例”的接口。
答案 1 :(得分:2)
这就是原因 - 按照图表: