Comment appeler un parent de la classe de fonction à partir de la classe dérivée de la fonction?
Comment dois-je appeler la fonction parent à partir d'une classe dérivée à l'aide de C++? Par exemple, j'ai une classe appelée parent
, et une classe appelée child
qui est dérivée à partir de parent. Au sein de
chaque classe il y a un print
fonction. Dans la définition de l'enfant, la fonction imprimer de je voudrais faire un appel aux parents de la fonction d'impression. Comment pourrais-je aller sur le faire?
- Toutes les solutions ci-dessus sont en supposant que votre fonction d'impression est une méthode statique. Est-ce le cas? Si la méthode n'est pas statique, puis les solutions ci-dessus ne sont pas pertinents.
- hhafez, vous vous trompez de la base::fonction() syntaxe ressemble à la méthode statique la syntaxe d'appel, mais il fonctionne pour les méthodes d'instance dans ce contexte.
- Je ne voudrais pas utiliser le MSVC __super car il est la plate-forme. Bien que votre code peut ne pas fonctionner sur une autre plate-forme, j'utiliserais d'autres suggestions, car ils le font comme la langue voulue.
- Double Possible de puis-je appeler une classe de base virtuelle de la fonction si je suis remplaçant?
- Le antipattern où les classes dérivées doivent toujours appeler le parent de la classe de fonctions Call super
Vous devez vous connecter pour publier un commentaire.
Je vais prendre le risque d'énoncer une évidence: Vous appelez la fonction, si elle est définie dans la classe de base, il est automatiquement disponible dans la classe dérivée (à moins qu'il
private
).Si il existe une fonction avec la même signature dans la classe dérivée, vous pouvez lever l'ambiguïté en ajoutant la base du nom de la classe suivi de deux-points
base_class::foo(...)
. Vous devriez noter que, contrairement à Java et C#, C++ ne pas un mot clé pour "la classe de base" (super
oubase
) depuis C++ prend en charge l'héritage multiple qui peut conduire à l'ambiguïté.D'ailleurs, vous ne peut pas dériver directement à partir de la même classe que deux fois depuis qu'il n'y aura aucun moyen de se référer à l'une des classes de base sur les autres.
template<class A, class B> class C: public A, public B {};
peut provenir de deux types de la même, pour des raisons, selon la façon dont votre code est utilisé (qui fait que A et B à la même), peut-être deux ou trois couche d'abstraction manière de quelqu'un pas au courant de ce que vous avez fait.virtual
méthodes.using namespace std
.You should note that unlike Java and C#, C++ does not have a keyword for "the base class"
.typedef left super;
dans votre classe, si vous voulez, alors vous pouvez vous référer àsuper::foo();
. Et puisque vous ne peut pas dériver de la même classe deux fois directement, vous devez le faire indirectementstruct left1 : left{}; struct left2 : left{}; class bottom : public left1, public left2 { ... };
mais vous êtes probablement mieux d'utiliser la composition plutôt que de l'héritage.Donné parent classe nommée
Parent
et de l'enfant classe nomméeChild
, vous pouvez faire quelque chose comme ceci:Noter que
Parent
est la classe du nom réel et pas un mot-clé.foo()
ici analogue àprint()
ou une fonction distincte? Et voulez-vous dire par l'utilisation deprivate
héritage pour masquer les détails hérité de la base, et de fournirpublic
l'occultation des fonctions pour les choses que vous ne souhaitez exposer?foo()
était analogue àprint()
. Permettez-moi de revenir en arrière à l'aide deprint()
car je pense que cela aurait plus de sens dans ce contexte. Disons que quelqu'un a créé une classe qui a effectué une série d'opérations sur un type de données particulier, ont exposé certains des accesseurs, et a eu unprint(obj&)
méthode. J'ai besoin d'une nouvelle classe qui travaille surarray-of-obj
mais tout le reste est le même. Composition les résultats dans beaucoup de code dupliqué. L'héritage minimise que, dansprint(array-of-obj&)
boucle d'appelprint(obj&)
, mais ne veulent pas les clients à appelerprint(obj&)
parce que ne fait pas sens pour eux de le faireSi votre classe de base est appelé
Base
, et votre fonction est appeléeFooBar()
vous pouvez l'appeler directement en utilisantBase::FooBar()
Dans MSVC Microsoft a un mot-clé spécifique pour que: __super
MSDN:
Vous permet de préciser explicitement que vous appelez une classe de base de la mise en œuvre d'une fonction qui vous sont prépondérantes.
typdef
ing la société mère, quelque chose commesuper
.__super
; je l'ai mentionné ici comme une alternative de la suggestion. Les développeurs doivent connaître leurs compilateur et de comprendre les avantages et les inconvénients de ses capacités.__super
. C'est agréable et simple, et pour les 99,9% de code qui est SAIN d'esprit et ne pas utiliser l'héritage multiple, il n'y a pas de problème avec elle. Spécifiant explicitement la classe de base a donné lieu à de multiples difficile à diagnostiquer horribles bugs dans notre base de code tout au long des années, où les gens se retrouvent accidentellement allant directement à partir de Level3->Niveau 1 et le saut de l'Level2 classe dans le milieu; __super empêche cela. Aussi code portable, c'est un bon point, mais pas tout le code se soucie d'être portable__super
n'est pas d'ajouter des fonctionnalités, parce que vous pouvez mettre le nom que la classe explicitement (ou obtenir l'habitude de fairetypedef Parent super
juste après la déclaration de classe si vous souhaitez écriresuper
): c'est le but principal est de l'envoi de l'appel de fonction à l'un des deux super-classes lorsqu'une méthode pourrait être dans l'un ou l'autre (c'est à dire, mixin scénario). Sacrifier la conformité à la norme peut être justifiée si vous l'avez explicitement besoin de cette fonctionnalité, pas pour les paresseux.Si modificateur d'accès de la classe de base de la fonction publique OU protégée, vous pouvez faire appel de la fonction membre de la classe de base de la classe dérivée.
Appel à la classe de base non-virtuelle et de la fonction membre virtuelle à partir des dérivées de la fonction de membre peut être faite.
Veuillez consulter le programme.
De sortie:
Appel de la méthode parent avec le parent de l'opérateur de résolution de portée.
Exemple de référence.