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