多重継承を使用したことはありませんが、最近それについて読んでいるときに、コード内で実際にどのように使用できるかを考え始めました。私が通常ポリモーフィズムを使用するとき、私は通常、次のような基本クラスのポインタとして宣言された新しい派生インスタンスを作成することによってそれを使用します。
BaseClass* pObject = new DerivedClass();
派生クラスで仮想関数を呼び出すときに正しいポリモーフィックな動作が得られるようにします。このようにして、仮想関数を介して動作に関して自分自身を管理するさまざまなポリモーフィックタイプのコレクションを作成できます。
多重継承の使用を検討するとき、私は同じアプローチを考えていましたが、次の階層がある場合、これをどのように行うのでしょうか?
class A {
virtual void foo() = 0;
};
class B : public A {
virtual void foo() {
// implementation
}
};
class C {
virtual void foo2() = 0;
};
class D : public C {
virtual void foo2() {
// implementation
}
};
class E : public C, public B {
virtual void foo() {
// implementation
}
virtual void foo2() {
// implementation
}
};
この階層を使用して、クラスEの新しいインスタンスを次のように作成できます。
A* myObject = new E();
また
C* myObject = new E();
また
E* myObject = new E();
しかし、それをtheとして宣言するとA*
、クラスCとDの継承階層のポリモーフィズムが失われます。同様に、それを宣言するとC*
、クラスAとBのポリモーフィズムが失われます。そのように宣言するとE*
、オブジェクトは基本クラスポインターを介してアクセスされないため、通常の方法でポリモーフィックな動作を取得できません。
だから私の質問はこれに対する解決策は何ですか?C ++は、これらの問題を回避できるメカニズムを提供しますか、それとも基本クラス間でポインター型を前後にキャストする必要がありますか?確かに、私は直接次のことを行うことができなかったので、これはかなり面倒です
A* myA = new E();
C* myC = dynamic_cast<C*>(myA);
キャストはNULLポインタを返すためです。