2011-05-26 2 views
4

ok que nous avons les classes suivantesC++ hériter des fonctions virtuelles

class A 
{ 
public: 
    virtual void taco() 
    { 
     cout << "Class A" << endl; 
    } 
}; 
class B: public A 
{ 
    public: 
    virtual void taco() 
    { 
     cout << "Class B" << endl; 
    } 
}; 
class C : public A 
{ 
    public: 
    void taco() 
    { 
     cout << "Class C" << endl; 
    } 
}; 

Et si je fais ce

A a = A(); 
B b = B(); 
C c = C(); 
a.taco(); //Class A 
b.taco(); //Class B 
c.taco(); //Class C 
deque<A> aa = deque<A>(); 
aa.push_back(a); 
aa.push_back(b); 
aa.push_back(c); 
for(int i=0;i<aa.size();i++) 
    aa[i].taco();//All Class A 
A r = B(); 
r.taco(); //Class A 

vous maintenant remarquerez quand j'initialiser A comme B ou C, il a gagné » t tirer les fonctions de B ou C. Je me demandais s'il y avait un moyen de contourner cela? Je comprends le concept que puisque l'objet est A il utilise la fonction taco de A, mais je me demandais juste s'il y avait un truc pour obtenir les autres fonctions. Mon projet est assez compliqué, et je ne peux pas connaître toutes les classes qui remplaceront A (à cause des plugins qui surchargent une classe). En outre, j'ai un peu besoin que la fonction virtuelle de base ait un corps pour ajouter un comportement par défaut. Merci.

+12

Utilisez des pointeurs et créez les objets dynamiquement. Le polymorphisme en C++ nécessite l'utilisation de pointeurs ou de références. Cela devrait être couvert dans n'importe quel manuel C++ - lequel utilisez-vous? –

+3

Pourquoi ne pas mettre cela comme réponse. – ColWhi

+0

Neil peut l'avoir écrit comme un commentaire, mais le traiter comme une réponse ;-) – Pike65

Répondre

15

Vous devez stocker des pointeurs dans deque, car le polymorphisme ne fonctionne qu'avec les types de pointeurs & de référence. Lorsque vous insérez ces objets dans le deque, des copies sont faites du type A, "découpant" les parties qui les ont rendues B ou C à l'origine.

De même, A r = B() crée juste un B temporaire et copie la A partie de celui-ci dans un A appelé r.

BTW par A a = A(); vous pourriez aussi bien écrire A a;. Ils ne sont pas complètement équivalents, mais ils font le même travail ici, et vous avez probablement voulu dire pour la version plus simple.

A a; 
B b; 
C c; 
a.taco(); //Class A 
b.taco(); //Class B 
c.taco(); //Class C 

// With pointers and containers 
deque<A*> aa; 
aa.push_back(&a); 
aa.push_back(&b); 
aa.push_back(&c); 
for (int i=0; i<aa.size(); i++) 
    aa[i]->taco(); // Hurray!  

// With refs 
B q; 
A& r = q; 
r.taco(); // Class B! 

(Rappelez-vous que ces objets a, b et c ont une durée de stockage automatique. Au moment où ils sont hors de portée, si le deque existe encore alors tous ses éléments sont des pointeurs non valides. Vous voudrez peut-être employer dynamique allocation pour contrôler davantage la durée de vie des objets A, B et C .. mais je laisserai cela comme exercice au lecteur.)

Questions connexes