私の C++ プログラムには、非常に特殊な状況があります。
次のクラスのセットアップを見てください。
class Base1 {
public: void baseMethod();
}
class Base2 : public Base1 {
...
}
class Common {
public: void commonMethod();
}
class Derived1 : public Base1, public Common {
...
}
class Derived2 : public Base2, public Common {
...
}
Base1Base2それらはライブラリの一部であるため、私にとって変更できません。
私が達成したいのは、 と の両方が同じメソッドDerived1を共有することです。そのため、そのメソッドを持つクラスを と の共通ベースとして使用します。Derived2commonMethod()CommonDerived1Derived2
ここでの問題は、 !で定義されてcommonMethod()いる呼び出しを含める必要があることです。- または -オブジェクトのコンテキストでは、これは合法ですが、そのメソッドを で定義する方法は?baseMethod()Base1Derived1Derived2Common
Base2からの仮想派生クラスとして宣言しBase1、 についても同じように宣言する場合Common、問題にならないことはわかっています (少なくとも についてはDerived2、 についてはわかりませんDerived1)。しかし、私は変更できないので、Base2とにかくそれは不可能です。
また、から継承したくないので、から継承させてからだけをCommon継承させることは機能しません!Base2Derived1Derived2CommonDerived1Base2
次に頭に浮かんだのは、の中に dynamic_cast を作成することでしたcommonMethod():
void Common::commonMethod() {
...
Base1* self = dynamic_cast<Base1*>(this);
if(self) {
self->baseMethod();
}
...
}
これはうまくいくようですが、これが「良い」解決策であるかどうかはわかりません...
それをより良くする方法はありますか?それとも、このソリューションはまったく悪くないと思いますか? :)