2014-04-30 2 views
1

J'ai une classe B qui a hérité de la classe A, mais je ne comprends pas pourquoi la classe B déclare de cette manière.Que signifient les déclarations suivantes?

class B : public A <B> 
{ 
public: 
    ... 
}; 

template <class T> 
class A 
{ 
public: 
     .... 
} 
+0

Votre question semble être mal formatée – Massa

+8

Demandez-vous ce que [CRTP] (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) est? – PeterT

+1

Je ne sais pas ce que CRTP est, et pourquoi nous utilisons ce modèle pour déclarer la classe? Merci! – Lei

Répondre

4

Comme déjà souligné par PeterT, c'est le curiously recurring template pattern (CRTP). C'est un moyen d'implémenter le polymorphisme statique en C++ car la classe de base A a des connaissances sur la sous-classe B et ses types et états (internes). Par exemple, la logique A peut renvoyer des objets du bon type qui ne seraient pas possibles avec le polymorphisme dynamique. Par exemple, la logique A peut renvoyer des objets du bon type. CRTP permet de déplacer cette logique vers la classe de base où le polymorphisme dynamique nécessiterait des fonctions virtuelles dans la classe dérivée pour traiter le bon type approprié à B.

Une explication plus détaillée est donnée here.

0

La classe A est une classe modèle. Donc, tout en héritant, B doit fournir une valeur pour l'argument templae T, qui dans ce cas est «B». Mais vous devez placer la définition de classe de A avant B, sinon il y aura une erreur de compilation.

+1

Ce qui n'explique pas le "pourquoi", et c'était la question. –

Questions connexes