2010-12-13 5 views
-1

Im essayant de génèrerait les éléments suivants:Quelles fonctions doivent être virtuelles pour générer des éléments spécifiques?

apple 
banana 
orange 
banana 

Dois-je faire mes fonctions virtuelles pour la sortie?

class Red 
{ 
public: 
    void PrintMe() { Foo(); Bar(); } 
    void Foo() { printf("pear\n"); } 
    void Bar() { printf("lemon\n"); } 
}; 

class Green : public Red 
{ 
public: 
    void PrintMe() { Bar(); Foo(); } 
    void Foo() { printf("apple\n"); } 
    void Bar() { printf("banana\n"); } 
}; 

class Blue : public Green 
{ 
public: 
    void Foo() { printf("orange\n"); } 
    void Bar() { printf("grape\n"); } 
}; 
int main(int argc, char* argv[]) 
{ 
    Green g; 
    Blue b; 

    Red *pR1 = &g; 
    Red *pR2 = &b; 
    pR1->PrintMe(); 
    pR2->PrintMe(); 
} 
+0

Nous avons voté pour terminer cette question urgente. Trop de problèmes pour pouvoir y répondre. –

+1

Pas de vote pour fermer et ne pas être d'accord avec le -1. Cette question a deux bonnes réponses (oui et d'autres questions, ou non parce que). Nourriture pour la pensée. –

+0

20 $ indique que l'OP ne sélectionne jamais de réponse et ne résout jamais la question pour donner un sens. –

Répondre

0

Red::Foo() et Red::Bar() doivent être virtuels.

+0

'Green :: PrintMe' appelle' Foo' et 'Bar' dans l'ordre inverse de' Red :: PrintMe'. –

+0

Désolé, je n'ai pas remarqué que –

+0

@larsmans Oui, mais si je ne me trompe pas, il veut imprimer "apple banana" ce qui signifie qu'il doit appeler 'Red :: PrintMe()' et que 'Green :: PrintMe() 'est un hareng rouge. –

0

Il semble y avoir quelques problèmes avec votre code: vous définissez une classe nommée rouge, mais vert hérite d'une classe nommée Red

Quoi qu'il en soit, si le rouge est votre classe de base et vous vous voulez que les autres classes remplacent ses méthodes, vous devez les déclarer virtual en effet.

0

Réponse courte: PrintMe() doit être virtuel.

Explication:

Puisque vous voulez appeler la méthode de l'objet spécialisé pointée par le pointeur de la classe de base, vous devez faire cette méthode virtuelle.

// Base class pointer pointing to specialized class 
Red *pR1 = new Green(); 

// If PrintMe() is not virtual, this call will be Red::PrintMe(). 
// If you want to call Green::PrintMe, make it virtual. 
pR1->PrintMe(); 
0

LOL! Personne n'a bien compris celui-là!

Vous devez créer PrintMe virtual car l'ordre de foo/bar peut changer.

Vous devez rendre Foo et Bar virtuel car ils font des choses différentes.

Vous devez rendre le DESTRUCTOR virtuel car vous implémentez une hiérarchie polymorphe. Celui-ci n'est même pas du tout dans votre code. Votre test particulier main() n'en a pas besoin, mais la plupart des utilisations raisonnables et non triviales le feraient. Edit: OK, peut-être que je me suis trompé aussi. Si vous ne voulez pas que PrintMe remplace réellement le comportement lorsqu'il est utilisé via un pointeur de base, il ne doit PAS être virtuel. Votre code est un peu confus. Personne ne le ferait de cette façon.

2

Il n'y a aucun moyen que vous pouvez obtenir « banane pomme banane orange » comme la sortie avec votre configuration actuelle, parce que:

  1. Pour imprimer « pomme banane » à l'aide Red *pR1, vous devez faire Foo et Bar virtuel.
  2. Une fois que vous déclarez une fonction comme virtuelle, elle le reste dans toutes les classes dérivées.
  3. Maintenant que Bar est virtuel, pR2->PrintMe() va imprimer "orange raisin" - il n'y a aucun moyen d'imprimer "banane".
+0

L'OP peut déclarer Bar const en Bleu. Alors ce ne serait pas une dérogation. –

+1

@Noah Roberts: J'ai seulement dit que ce n'était pas possible "avec la configuration actuelle", parce que la question de l'OP était seulement de rendre "certaines fonctions virtuelles". – casablanca

+0

Eh bien, la configuration actuelle n'a pas de fonctions virtuelles non plus, alors voilà); –

Questions connexes