Digamos que tenemos una clase de plantilla Area
, que tiene una variable miembro T area
, una función miembro T getArea()
y una void setArea(T)
.
Puedo crear un Area
objeto de un tipo específico escribiendo Area<int>
.
Ahora tengo una clase Rectangle
que hereda la Area
clase. Dado que en Rectangle
sí mismo no es una plantilla, no puedo escribir Rectangle<int>
.
¿Cómo me especializo en el Area
tipo heredado de Rectangle
objetos?
EDITAR: Lo siento, olvidé aclarar: mi pregunta es si es posible heredar el Área sin especializarla, por lo que no se hereda como Área de ints sino como Área Rectángulo para la que se pueden especializar los tipos.
c++
templates
inheritance
dtech
fuente
fuente
Respuestas:
Para entender las plantillas, es una gran ventaja tener la terminología correcta porque la forma en que se habla de ellas determina la forma de pensar en ellas.
Específicamente,
Area
no es una clase de plantilla, sino una plantilla de clase. Es decir, es una plantilla a partir de la cual se pueden generar clases.Area<int>
es una clase de este tipo (que es no un objeto, pero por supuesto se puede crear un objeto de esa clase de la misma manera que se pueden crear objetos de cualquier otra clase). Otra de esas clases seríaArea<char>
. Tenga en cuenta que esas son clases completamente diferentes, que no tienen nada en común excepto por el hecho de que se generaron a partir de la misma plantilla de clase.Dado
Area
que no es una clase, no puede derivar la claseRectangle
de ella. Solo puede derivar una clase de otra clase (o varias de ellas). Dado queArea<int>
es una clase, podría, por ejemplo, derivarRectangle
de ella:Dado que
Area<int>
yArea<char>
son clases diferentes, incluso puede derivar de ambas al mismo tiempo (sin embargo, al acceder a miembros de ellas, tendrá que lidiar con ambigüedades):Sin embargo, debe especificar de qué clase derivar cuando defina
Rectangle
. Esto es cierto sin importar si esas clases se generan a partir de una plantilla o no. Dos objetos de la misma clase simplemente no pueden tener diferentes jerarquías de herencia.Lo que puede hacer es crear
Rectangle
una plantilla también. Si tú escribesTiene una plantilla
Rectangle
de la que puede obtener una clase de laRectangle<int>
que se derivaArea<int>
y una clase diferente de laRectangle<char>
que se derivaArea<char>
.Puede ser que desee tener un solo tipo
Rectangle
para poder pasar todo tipo deRectangle
a la misma función (que en sí misma no necesita conocer el tipo de Área). Dado que lasRectangle<T>
clases generadas al crear instancias de la plantillaRectangle
son formalmente independientes entre sí, no funciona de esa manera. Sin embargo, puede hacer uso de la herencia múltiple aquí:Si es importante que su genérico
Rectangle
se derive de un genérico,Area
también puede hacer el mismo truco conArea
:fuente
¿Estás tratando de derivar
Area<int>
? En cuyo caso haces esto:EDITAR: Después de la aclaración, parece que en realidad también está tratando de hacer
Rectangle
una plantilla, en cuyo caso lo siguiente debería funcionar:fuente
fuente
Convierta Rectangle en una plantilla y pase el nombre del tipo a Area:
fuente
Rectangle
tendrá que ser una plantilla, de lo contrario, es solo un tipo . No puede ser una no plantilla mientras su base lo sea mágicamente. (Su base puede ser una instanciación de plantilla , aunque parece que desea mantener la funcionalidad de la base como plantilla ).fuente
fuente