C++:如何在具有基类的父接口中实现函数?

eer*_*ika 1 c++ oop inheritance interface

考虑以下层次结构

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() {};
};
Run Code Online (Sandbox Code Playgroud)
  • 除了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();
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器看不到那个继承自哪个Interface::foo()实现?BaseImpl

我想,我可以实现foo()Impl明确和委托调用Base是这样的:

class Impl: public SubInterface, public Base {
public:
    void foo() {
        Base::foo();
    }
    void bar() {};
};
Run Code Online (Sandbox Code Playgroud)

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

ela*_*dan 5

SubInterface并且Base应该从Interface其他方面继承,否则你会以可怕的钻石形式产生歧义. 基本上,Impl包含两个"实例"的接口.