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それ以外の場合は、恐ろしいダイヤモンドの形であいまいさを作成しています。 基本的に、Impl にはインターフェイスの 2 つの「インスタンス」が含まれていますBaseInterface

于 2013-02-17T01:34:34.893 に答える
2

理由は次のとおりです。図に従ってください。

ここに画像の説明を入力

于 2013-02-17T01:39:08.040 に答える