私はクラスの、このような階層構造を持っている:複数の派生クラスでCRTPを使用し、ポリモーフィックで使用できますか?
template <class Type>
class CrtpBase
{
protected:
Type& real_this()
{
return static_cast<Type&>(*this);
}
};
template <class ChildType>
class Base : CrtpBase<ChildType>
{
public:
void foo()
{
this->real_this().boo();
}
};
class Derived1 : public Base<Derived1>
{
public:
void boo { ... }
};
class Derived2 : public Base<Derived2>
{
public:
void boo { ... }
};
事は、私はこのように私のクラスを使用する場合は、次のとおりです。
std::vector<Base*> base_vec;
base_vec.push_bach(new Derived1());
base_vec.push_bach(new Derived2());
.........
base_vec[0]->foo();
しかし、すべての基底クラスが派生しているため、これは、可能ではありませんクラスは異なります(実際にはBaseは型ではなく、テンプレートです)。ですから、複数の派生クラスを持つcrtpと多態性を併用する方法はありますか?確かにそこに
私がcrtpを使用したすべてのことは、仮想関数を避けることでした。このソリューションの意味は何ですか? crtpクラスを導入して仮想関数を回避し、抽象クラスを仮想関数で使用して問題を解決しますか?ナンセンス – user1289
@ user1289まあ、CRTPはコンパイル時のソリューションです。つまり、さまざまなタイプに基づいてコンパイル時にディスパッチすることができます。次に、同じタイプのものを要求しました。これは、ランタイムディスパッチとそれに伴う仮想関数を意味します。 'boo()'がまだ静的にディスパッチされていることに注意してください。 – Angew
@Angew、crtpなしでも、必要なランタイム・ディスパッチは1つしかないでしょう。この場合は、ランタイムとスタティックが1つありますが、crtpを使用しない場合よりも悪いことがあります。おそらく私の質問には解決策がない、ちょうどこれにハックがあるかどうかをチェックしたいと思った。 – user1289