7
votes

Fonctions virtuelles par rapport aux rappels

Considérez un scénario où il y a deux classes, c'est-à-dire une base et dérivée. Si la classe de base veut appeler une fonction de la classe dérivée, elle peut le faire en faisant une fonction virtuelle et définissant ce VF dans la classe dérivée ou en utilisant rappels . Je veux savoir dans ce qui devrait être préféré sur les deux? Choisir parmi les deux dépend des situations / conditions?

edit: Clarification des questions:

La situation que je faisait référence est qu'il existe une classe de base qui reçoit des messages. Ces différents messages doivent être traités différemment par la classe dérivée, de sorte qu'un moyen est de créer une fonction virtuelle et de laisser la classe dérivée le mettre en œuvre, de manipuler tous les messages si divers cas de commutation.

Une autre solution consiste à implémenter les rappels via les pointeurs de fonction (pointe vers les fonctions de la classe dérivée) à l'intérieur des modèles (des modèles sont nécessaires pour gérer l'objet de la classe dérivée et des noms de fonction). Les modèles et les pointeurs de fonction vont résider dans la classe de base.


3 commentaires

Je pense que vous auriez besoin de fournir un exemple concret pour clarifier un peu votre question si vous cherchez une réponse. Je ne comprends pas pourquoi vous auriez besoin de «divers étuis de commutation» par exemple avec l'option une. Il existe généralement des façons à travers la conception du programme. Dans votre deuxième option, on ne sait pas ce que vous entendez par des modèles. Parlez-vous de templats C ++ ou d'une sorte de modèle de message contenant des informations pour identifier les pointeurs de fonction? Quelque chose de plus concret, même si c'était un pseudo code serait utile.


@forsvarir Merci d'avoir répondu, je vais faire un suivi dans quelques jours.


@forsvarir Pardonnez-moi pour ne pas suivre sur ce sujet. I reviendra à cela dans quelques jours, il y a d'autres questions en instance aussi. Je me souviens d'eux complètement, mais j'ai actuellement trop de plats sur mon assiette. va suivre bientôt.


3 Réponses :


6
votes

Un appel de fonction virtuelle est réellement un rappel.

L'appelant recherche l'entrée correspondante dans la table de fonction virtuelle de l'objet et l'appelle. C'est exactement comme un rappel, sauf que les pointeurs de la fonction membre ont une syntaxe maladroite. Fonctions virtuelles Déchargez le travail sur le compilateur, ce qui en fait une solution très élégante.

Les fonctions virtuelles sont le moyen de communiquer dans la hiérarchie d'héritage.


3 commentaires

Merci d'avoir répondu, mais je faisais référence aux rappels C ++ qui sont mis en œuvre via des modèles. Deuxièmement, il doit y avoir une raison que l'un des deux est préféré sur une situation donnée?


Le terme rappel est un peu vague. S'il vous plaît donner un exemple que nous pouvons affiner nos réponses (c'est-à-dire l'ajouter à votre question)


@ Kgiannakakis, @forsvarir: J'ai modifié la question pour plus de clarification, si cela n'est pas clair, veuillez me le faire savoir.



5
votes

Je pense que cela se résume à une décision sur la question de savoir si le comportement dont vous parlez est quelque chose qui appartient à l'héritière qui "base" connaît et des outils de base.

Si vous allez avec une solution de rappel, la méthode de rappel (en fonction de la signature) ne doit pas être mise en œuvre dans un enfant de base. Cela peut être approprié si, par exemple, vous vouliez dire "Cet événement s'est produit" à un "auditeur d'événements" qui pourrait être dans une classe dérivée ou pourrait être dans une classe totalement indépendante qui s'intéresse à l'événement.

Si vous allez avec la solution de fonction virtuelle, vous coupliez plus étroitement l'implémentation des classes dérivées et de base.

Une lecture intéressante, qui peut aller un moyen de répondre à votre question est la suivante: rappels en C ++ qui parle de l'utilisation des foncteurs. Il y a aussi un exemple sur Wikipedia qui utilise un rappel de modèle pour le tri. Vous remarquerez que la mise en œuvre du rappel (qui est une fonction de comparaison) ne doit pas nécessairement être dans l'objet qui effectue le tri. S'il était mis en œuvre à l'aide de méthodes virtuelles, cela ne serait pas le cas.


1 commentaires

Dans mon cas, la classe de base ne connaît pas la fonction de classe dérivée qui va gérer le changement w.r.t la classe dérivée. Je vais regarder votre lien, merci.



2
votes

Je ne pense pas que les deux cas que vous décrivez sont comparables. Les fonctions virtuelles sont un outil de polymorphisme qui vous aider à étendre une classe de base afin de fournir des fonctionnalités supplémentaires. La principale caractéristique d'eux est que la décision que la fonction sera appelée est faite au moment de l'exécution.

Callbacks est un concept plus général, qui ne s'applique pas uniquement à une relation parent-enfant de classe.

Donc, si vous voulez faire impliquer de prolonger une classe de base, je vais certainement aller avec des fonctions virtuelles. Assurez-vous de bien comprendre comment fonctionnent les fonctions virtuelles.


0 commentaires