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 Areaobjeto de un tipo específico escribiendo Area<int>.
Ahora tengo una clase Rectangleque hereda la Areaclase. Dado que en Rectanglesí mismo no es una plantilla, no puedo escribir Rectangle<int>.
¿Cómo me especializo en el Areatipo heredado de Rectangleobjetos?
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,
Areano 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
Areaque no es una clase, no puede derivar la claseRectanglede ella. Solo puede derivar una clase de otra clase (o varias de ellas). Dado queArea<int>es una clase, podría, por ejemplo, derivarRectanglede 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
Rectangleuna plantilla también. Si tú escribesTiene una plantilla
Rectanglede 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
Rectanglepara poder pasar todo tipo deRectanglea 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 plantillaRectangleson 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
Rectanglese derive de un genérico,Areatambié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
Rectangleuna 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
Rectangletendrá 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