2

考虑以下层次结构:

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() {};
};
  • 除了 foo() 之外,还有几个子接口提供其他方法。
  • 一个子接口可以有多个实现类。
  • foo() 总是以同样的方式实现。

这是一个模拟如何使用这些类的示例:

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()的实现?BaseImpl

我想我可以显式地实现foo()并将Impl调用委托给Base这样的:

class Impl: public SubInterface, public Base {
public:
    void foo() {
        Base::foo();
    }
    void bar() {};
};

但是,我必须对所有实现子接口的类都这样做,所以这种方式并不完全理想。有更好的解决方案吗?

4

2 回答 2

5

SubInterface并且Base应该从虚拟继承,否则你会以可怕的钻石Interface的形式产生歧义 基本上,发生的事情是 Impl 包含两个接口的“实例”。

于 2013-02-17T01:34:34.893 回答
2

这就是为什么 - 按照图表:

在此处输入图像描述

于 2013-02-17T01:39:08.040 回答