2010-10-22 22 views
1

Dans l'espoir de simplifier un problème de devoirs traitant de l'héritage, j'ai pensé qu'il pourrait être préférable d'utiliser le polymorphisme pour accomplir la tâche. Ce n'est pas obligatoire, mais cela a beaucoup plus de sens si c'est possible. Cependant, je reçois des erreurs de symboles qui font que cela fonctionne comme je le pensais ou simplement la définition de la classe de base. Je veux que la fonction surchargée soit basée sur l'objet à appeler.Les modèles enfants peuvent-ils être stockés dans un tableau de classes de base et utiliser une fonction virtuelle surchargée?

template <class T> 
class Fruit { 
    private: 
    int count; 
    T type; 
    public: 
    virtual void Info(); 
}; 

template <class T> 
class Apple : public Fruit<T> { 
    private: 
    int variety; 
    public: 
    void Info(); 
}; 

// more fruit-child classes 

vector<Fruit<int> > fruits; // contains object of various derived types 

... 

for(int i=0; i<fruits.size(); i++ 
    fruits[i].Info(); 
+1

Quel est le but du type? Si c'est un champ de type, vous n'en avez probablement pas besoin du tout. – JoshD

+2

Votre vecteur de Fruit devrait être un vecteur de 'Fruit *', sinon vous aurez des problèmes de tranchage. – JoshD

+0

Quel est le problème que vous essayez de résoudre? Quelle est la motivation de lancer * à la fois * le polymorphisme à la compilation (templates) * et * le polymorphisme à l'exécution (inheritance)? – Arun

Répondre

1

Je vais laisser la chose du type de côté, mais je pense que vous ne avez probablement pas besoin et donc ne pas besoin du modèle ... mais voici ce que vous avez besoin:

Tout d'abord, le vecteur doit être de pointeurs:

vector<Fruit<int> *> fruits;

cela empêche slicing (où la partie d'Apple de l'objet est coupé).

En outre, maintenant que vous avez des pointeurs, la boucle va changer:

for(int i=0; i<fruits.size(); i++) 
    fruits[i]->Info(); 

Cela va maintenant appeler la fonction Info appropriée pour le type de fruits que vous avez.

+0

J'utiliserais vector >> au lieu de pointeurs bruts. –

+0

@VJo: Ce serait mieux, mais je suppose pour cette affectation qui ne sera pas autorisée. De plus, compte tenu de la question du PO, je suppose que le PO aurait intérêt à apprendre cette méthode. – JoshD

+0

Cela donne des problèmes de compilation 'vector *> fruits; Apple a; fruits.push_back (a); 'Merci pour l'aide jusqu'ici, c'est certainement dans la direction dont j'ai besoin ... –