あなたがしようとしているのは、共通の基本クラスを持つ可能性のある 2 つのクラスから継承することです。それは正しいですか? その場合、仮想継承の問題に対処する必要があります (つまり、関心のある 2 つのクラスの両方について、基本クラスの継承を仮想として宣言する必要があります)。これは、いくつかのランタイム サポート (2 つの vpointers 以上) により、わずかな (おそらく取るに足らない) オーバーヘッドを引き起こすだけです。
あなたのコードは CRTP ではなく (CRTP では、基本クラスは派生クラスを受け取るテンプレート化されたものです)、取り除こうとしていた二重継承の問題にまったく対処していないようです。
私が見る限り、仮想継承を受け入れて最小限のオーバーヘッドで発生するvirtualキーワードを使用するか、コードをリファクタリングすることができます。
あなたが何をしようとしているのか完全には理解できませんでしたが、共通の基本クラスを持つ2つの異なるクラスから継承しようとしている場合(仮想継承はこれに関するすべてです)、何らかの理由でvirtualキーワードの場合、CRTP を次のように使用できます。
#include <iostream>
using namespace std;
template<class Derived>
class Base
{
public:
void basefunc() { cout << "base here"<< endl; }
virtual void polyfunc() { cout << "base poly here"<< endl; }
};
class Derived : public Base<Derived>
{
public:
void derivedfunc() { cout << "derived here"<< endl; }
virtual void polyfunc() { cout << "derived poly here"<< endl; }
};
class OtherDerived : public Base<OtherDerived>
{
public:
void otherderivedfunc() { cout << "otherderived here"<< endl; }
virtual void polyfunc() { cout << "otherderived poly here"<< endl; }
};
class InheritingFromBoth : public Derived, public OtherDerived
{
public:
void inheritingfunc() { cout << "inheritingfromboth here" << endl; }
virtual void polyfunc() { cout << "inheritingfromboth poly here"<< endl; }
};
int main() {
Derived obj;
OtherDerived obj2;
InheritingFromBoth *obj3 = new InheritingFromBoth();
Derived *der = dynamic_cast<Derived*>(obj3);
der->polyfunc();
OtherDerived *der2 = dynamic_cast<OtherDerived*>(obj3);
der2->polyfunc();
Base<Derived>* bptr = dynamic_cast<Base<Derived>*>(obj3);
bptr->polyfunc();
Base<OtherDerived>* bptr2 = dynamic_cast<Base<OtherDerived>*>(obj3);
bptr2->polyfunc();
return 0;
}
基本クラスの 2 つの異なるインスタンスを作成することで、継承のあいまいさを回避できます。
基本クラスと基本派生クラスから同時に継承する場合の、より単純で、おそらくよりクリーンな解決策は次のとおりです。
- クラス BaseとBase 派生クラスから継承すると、Base メソッドと Base 派生メソッドに同時にアクセスできるようになりたいと思います..
クラスの設計で名前を隠す潜在的な 問題に注意を払い、ポリモーフィズムを使用して、実際に変更したい関数の動作を「カスタマイズ」する(キャスト制御できる)場合、Base -> Derived -> YourClass
最終的に解決できるクリーンな階層あなたの問題。
あなたの特定のケースでは、多くのアプリケーションで使用されていると他の人が指摘しているように、あなたのアプローチは機能しますが、二重継承の問題を効果的に解決できるとは思いません。最終的には、特定の設計ケースのみが、それほど害のないソリューションにつながる可能性があります。