2010-10-22 3 views
0

Est-il possible qu'un type générique puisse être utilisé pour contenir un enfant d'une classe de base.classe contenant un type générique d'un enfant

De la mission qui m'est confiée, je dois créer quelque chose de similaire à la structure suivante. Fondamentalement, je pense que vous ne pouvez pas avoir un type générique de modèle être le même qu'une classe dérivée. Ai-je tort? Y a-t-il quelque chose de similaire qui pourrait fonctionner?

Mise à jour: Pour l'affectation, je crois que nous devons utiliser l'héritage pour montrer l'utilisation des fonctions virtuelles. J'ai mis à jour le code ci-dessus. Je pense que cela fonctionnerait, mais n'a pas besoin de modèles pour réussir. Nous n'avons couvert aucune méthode d'héritage avancée et redondante en classe.

+0

Pourquoi pensez-vous que ce soit la mauvaise façon de procéder? –

+0

Qu'essayez-vous de faire? Je ne comprends absolument pas ce que votre exemple tente d'accomplir. Vous ne pouvez pas hériter de 'Fruit' car' Fruit' n'est pas une classe. Vous devez hériter de 'Fruit '. Si votre intention est de laisser Apple être une sous-classe de Fruit , vous rencontrerez des problèmes, car alors une instance de Apple aura un membre de type Apple, qui ne peut pas fonctionner à moins que vous change le membre de type 'T' en un pointeur ou une référence. – sepp2k

+0

Je ne savais pas syntaxiquement si l'héritage d'un modèle était correct. Mais oui, on m'a demandé d'avoir un modèle de Fruit, qui sera instancié avec Apple comme T. J'ai aussi demandé à Apple d'hériter de Fruit. Donc, on m'a demandé d'avoir 'Apple: fruit privé '. –

Répondre

0

Ceci est parfaitement bien, en principe.

Pour plus d'informations sur l'utilisation de la classe dérivée comme type d'instanciation dans un modèle de classe qui est sa base, en particulier l'exemple de polymorphisme statique qui devrait ressembler «curieusement».

template <class Derived> struct Base 
{ 
    void interface() 
    { 
     // ... 
     static_cast<Derived*>(this)->implementation(); 
     // ... 
    } 

    static void static_func() 
    { 
     // ... 
     Derived::static_sub_func(); 
     // ... 
    } 
}; 

struct Derived : Base<Derived> 
{ 
    void implementation(); 
    static void static_sub_func(); 
}; 
+0

Ceci est intéressant et montre que cela peut arriver. Cependant, la façon dont cela m'a été décrit ne fonctionnera pas de cette manière ... –

0

Ignorer les questions de pourquoi vous voulez faire .... vous pouvez obtenir un bout de chemin en faisant ce qui suit:

template <class T> class Fruit 
{ 
private: 
    int count; 
    int location_id; 
    T* type; 
}; 

class Apple : private Fruit<Apple> 
{ 
private: 
    int seeds; 
    bool red; 
}; 

Fruit<Apple> appleinventory[SIZE]; 

Notez le type T * est maintenant un pointeur à Apple plutôt qu'une instance d'Apple.

Questions connexes