Disons que nous avons une classe de modèle Area
, qui a une variable membre T area
, a T getArea()
et une void setArea(T)
fonction membre.
Je peux créer un Area
objet d'un type spécifique en tapant Area<int>
.
Maintenant, j'ai une classe Rectangle
qui hérite de la Area
classe. Puisque Rectangle
lui-même n'est pas un modèle, je ne peux pas taper Rectangle<int>
.
Comment spécialiser le Area
type hérité des Rectangle
objets?
EDIT: Désolé, j'ai oublié de clarifier - ma question est de savoir s'il est possible d'hériter de Area sans le spécialiser, donc il n'est pas hérité en tant que Area of ints mais en tant que Area Rectangle peut spécialiser les types.
c++
templates
inheritance
dtech
la source
la source
Réponses:
Pour comprendre les modèles, il est extrêmement avantageux de clarifier la terminologie, car la façon dont vous en parlez détermine la façon de les penser.
Plus précisément, ce
Area
n'est pas une classe de modèle, mais un modèle de classe. Autrement dit, il s'agit d'un modèle à partir duquel des classes peuvent être générées.Area<int>
est une telle classe (ce n'est pas un objet, mais bien sûr, vous pouvez créer un objet à partir de cette classe de la même manière que vous pouvez créer des objets à partir de n'importe quelle autre classe). Une autre classe seraitArea<char>
. Notez que ce sont des classes complètement différentes, qui n'ont rien de commun si ce n'est qu'elles ont été générées à partir du même modèle de classe.Puisque ce
Area
n'est pas une classe, vous ne pouvez pas en dériver la classeRectangle
. Vous ne pouvez dériver une classe qu'à partir d'une autre classe (ou de plusieurs d'entre elles). PuisqueArea<int>
est une classe, vous pouvez, par exemple, en dériverRectangle
:Puisque
Area<int>
etArea<char>
sont des classes différentes, vous pouvez même dériver des deux en même temps (cependant, lorsque vous accédez à leurs membres, vous devrez faire face à des ambiguïtés):Cependant, vous devez spécifier de quelle classe dériver lorsque vous définissez
Rectangle
. Cela est vrai, que ces classes soient générées à partir d'un modèle ou non. Deux objets de la même classe ne peuvent tout simplement pas avoir des hiérarchies d'héritage différentes.Vous pouvez également créer
Rectangle
un modèle. Si vous écrivezVous avez un modèle à
Rectangle
partir duquel vous pouvez obtenir une classeRectangle<int>
qui dériveArea<int>
et une classe différenteRectangle<char>
qui dériveArea<char>
.Il se peut que vous souhaitiez avoir un seul type
Rectangle
pour pouvoir passer toutes sortes de chosesRectangle
à la même fonction (qui elle-même n'a pas besoin de connaître le type Area). Étant donné que lesRectangle<T>
classes générées par l'instanciation du modèleRectangle
sont formellement indépendantes les unes des autres, cela ne fonctionne pas de cette façon. Cependant, vous pouvez utiliser l'héritage multiple ici:S'il est important que votre générique
Rectangle
soit dérivé d'un générique,Area
vous pouvez également faire la même choseArea
:la source
Essayez-vous simplement de dériver
Area<int>
? Dans quel cas vous faites ceci:EDIT: Après la clarification, il semble que vous essayez également de créer
Rectangle
un modèle, auquel cas ce qui suit devrait fonctionner:la source
la source
Faites de Rectangle un modèle et passez le nom de type à Area:
la source
Rectangle
devra être un modèle, sinon ce n'est qu'un type . Il ne peut pas être un non-modèle tant que sa base l'est comme par magie. (Sa base peut être une instanciation de modèle , bien que vous sembliez vouloir conserver les fonctionnalités de la base en tant que modèle .)la source
la source