Vamos dizer que temos uma classe de modelo Area
, que tem uma variável de membro T area
, um T getArea()
e um void setArea(T)
membro funções.
Posso criar um Area
objeto de um tipo específico digitando Area<int>
.
Agora eu tenho uma classe Rectangle
que herda a Area
classe. Já que Rectangle
ele mesmo não é um modelo, não posso digitar Rectangle<int>
.
Como posso especializar o Area
tipo herdado para Rectangle
objetos?
EDIT: Desculpe, esqueci de esclarecer - minha dúvida é se é possível herdar Área sem especializá-la, então não é herdada como Área de ints, mas como Retângulo de Área pode especializar os tipos para.
c++
templates
inheritance
dtech
fonte
fonte
Respostas:
Para entender os modelos, é uma grande vantagem definir a terminologia correta, porque a maneira como você fala sobre eles determina a maneira de pensar sobre eles.
Especificamente,
Area
não é uma classe de modelo, mas um modelo de classe. Ou seja, é um modelo a partir do qual as classes podem ser geradas.Area<int>
é tal classe um (é não um objeto, mas é claro que você pode criar um objeto dessa classe da mesma forma que você pode criar objetos a partir de qualquer outra classe). Outra classe seriaArea<char>
. Observe que essas são classes completamente diferentes, que não têm nada em comum, exceto pelo fato de que foram geradas a partir do mesmo modelo de classe.Como
Area
não é uma classe, você não pode derivar a classeRectangle
dela. Você só pode derivar uma classe de outra classe (ou de várias delas). ComoArea<int>
é uma classe, você poderia, por exemplo, derivarRectangle
dela:Como
Area<int>
eArea<char>
são classes diferentes, você pode até derivar de ambas ao mesmo tempo (no entanto, ao acessar membros delas, você terá que lidar com ambigüidades):No entanto, você deve especificar de qual classe derivar ao definir
Rectangle
. Isso é verdade, não importa se essas classes são geradas a partir de um modelo ou não. Dois objetos da mesma classe simplesmente não podem ter hierarquias de herança diferentes.O que você pode fazer é criar
Rectangle
um modelo também. Se você escreverVocê tem um modelo
Rectangle
do qual pode obter uma classeRectangle<int>
que deriva deArea<int>
e uma classe diferenteRectangle<char>
que derivaArea<char>
.Pode ser que você queira ter um único tipo
Rectangle
para que possa passar todos os tipos deRectangle
para a mesma função (que por si só não precisa saber o tipo de Área). Como asRectangle<T>
classes geradas pela instanciação do modeloRectangle
são formalmente independentes umas das outras, isso não funciona. No entanto, você pode usar a herança múltipla aqui:Se for importante que o seu genérico
Rectangle
seja derivado de um genérico,Area
você também pode fazer o mesmo comArea
:fonte
Você está apenas tentando derivar
Area<int>
? Nesse caso, você faz isso:EDITAR: Após o esclarecimento, parece que você está realmente tentando fazer
Rectangle
um modelo também; nesse caso, o seguinte deve funcionar:fonte
fonte
Transforme o retângulo em um modelo e passe o nome do tipo para a área:
fonte
Rectangle
terá que ser um modelo, caso contrário, é apenas um tipo . Não pode ser um não-modelo enquanto sua base é magicamente. (Sua base pode ser uma instanciação de modelo , embora você pareça querer manter a funcionalidade da base como um modelo .)fonte
fonte