0

私の 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();
  }
  ...
}

これはうまくいくようですが、これが「良い」解決策であるかどうかはわかりません...

それをより良くする方法はありますか?それとも、このソリューションはまったく悪くないと思いますか? :)

4

2 に答える 2