次の階層を検討してください。
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()
で実装されているかをコンパイラが認識できないのはなぜですか?Base
Impl
私は明示的に実装foo()
し、次のようImpl
に呼び出しを委任できると考えましたBase
:
class Impl: public SubInterface, public Base {
public:
void foo() {
Base::foo();
}
void bar() {};
};
ただし、サブインターフェイスを実装するすべてのクラスに対してこれを行う必要があるため、この方法は理想的ではありません。より良い解決策はありますか?