J'ai une telle hiérarchie de classes:Puis-je utiliser CRTP avec plusieurs classes dérivées et les utiliser de façon polymorphique?
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 { ... }
};
La chose est, je veux utiliser mes cours ainsi:
std::vector<Base*> base_vec;
base_vec.push_bach(new Derived1());
base_vec.push_bach(new Derived2());
.........
base_vec[0]->foo();
Mais ce n'est pas possible, parce que la classe de base pour tous les dérivés classes est différent (en fait, Base n'est pas du tout un type, c'est un template). Donc, est-il possible d'utiliser crtp avec plusieurs classes dérivées, avec le polymorphisme?
La chose que j'ai utilisée crtp, était d'éviter les fonctions virtuelles, alors quelle est la signification de cette solution? Introduire la classe crtp pour éviter les fonctions virtuelles, puis utiliser la classe abstraite avec fonction virtuelle pour résoudre le problème? non-sens – user1289
@ user1289 Eh bien, CRTP est une solution de compilation, ce qui signifie que vous disposez d'une répartition à la compilation basée sur différents types. Ensuite, vous avez demandé à avoir le même type, ce qui signifie la répartition de l'exécution et donc les fonctions virtuelles. Notez que 'boo()' est toujours envoyé statiquement. – Angew
@ Angew, sans crtp aussi il y aurait seulement besoin d'une expédition d'exécution, dans ce cas, j'ai un temps d'exécution et un statique, probablement pire que sans utiliser crtp. Probablement il n'y a pas de solution à ma question, je voulais juste vérifier s'il y a un hack à cela. – user1289