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

时间:2013-02-17 01:27:09

标签: 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() {};
};
  • 除了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() {}; }; ,如下所示:

{{1}}

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

2 个答案:

答案 0 :(得分:5)

SubInterfaceBase应该从Interface虚拟继承,否则您会以dreaded diamond的形式创建歧义 基本上,会发生的是Impl包含两个“实例”的接口。

答案 1 :(得分:2)

这就是原因 - 按照图表:

enter image description here