Comment 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 du parent. Dans chaque classe, il y a une print
fonction. Dans la définition de la fonction d'impression de l'enfant, je voudrais appeler la fonction d'impression des parents. Comment pourrais-je procéder?
c++
oop
inheritance
IaCoder
la source
la source
Réponses:
Je prendrai le risque de dire l'évidence: vous appelez la fonction, si elle est définie dans la classe de base, elle est automatiquement disponible dans la classe dérivée (sauf si elle l'est
private
).S'il existe une fonction avec la même signature dans la classe dérivée, vous pouvez la désambiguïser en ajoutant le nom de la classe de base suivi de deux deux-points
base_class::foo(...)
. Vous devez noter que contrairement à Java et C #, C ++ n'a pas de mot-clé pour "la classe de base" (super
oubase
) car C ++ prend en charge l' héritage multiple, ce qui peut conduire à une ambiguïté.Par ailleurs, vous ne pouvez pas dériver directement de la même classe deux fois car il n'y aura aucun moyen de faire référence à l'une des classes de base par rapport à l'autre.
la source
template<class A, class B> class C: public A, public B {};
deux types peuvent être identiques pour des raisons dépendant de la façon dont votre code est utilisé (ce qui rend A et B identiques), peut être deux ou trois couche d'abstraction façon de quelqu'un qui ne sait pas ce que vous avez fait.using namespace std
.Étant donné la classe parent nommée
Parent
et la classe enfant nomméeChild
, vous pouvez faire quelque chose comme ceci:Notez qu'il
Parent
s'agit du nom réel de la classe et non d'un mot clé.la source
foo()
iciprint()
une fonction analogue ou distincte? Et voulez - vous dire en utilisant l'private
héritage pour cacher les détails hérités de la base, et en fournissantpublic
shadowing fonctions pour des choses que vous ne souhaitez exposer?foo()
c'était analogue àprint()
. Permettez-moi de revenir à l'utilisationprint()
car je pense que cela aurait plus de sens dans ce contexte. Disons que quelqu'un a créé une classe qui a effectué un ensemble d'opérations sur un type de données particulier, a exposé certains accesseurs et a eu uneprint(obj&)
méthode. J'ai besoin d'une nouvelle classe qui fonctionnearray-of-obj
mais tout le reste est le même. La composition entraîne beaucoup de code dupliqué. L'héritage minimise cela, dans lesprint(array-of-obj&)
appels en boucleprint(obj&)
, mais ne veut pas que les clients appellentprint(obj&)
car cela n'a pas de sens pour eux de le faireSi votre classe de base est appelée
Base
et que votre fonction est appelée,FooBar()
vous pouvez l'appeler directement à l'aide deBase::FooBar()
la source
Dans MSVC, il existe un mot clé spécifique à Microsoft pour cela: __super
MSDN: vous permet d'indiquer explicitement que vous appelez une implémentation de classe de base pour une fonction que vous remplacez.
la source
typdef
le parent comme quelque chosesuper
.__super
; Je l'ai mentionné ici comme suggestion alternative. Les développeurs doivent connaître leur compilateur et comprendre les avantages et les inconvénients de ses capacités.Si le modificateur d'accès de la fonction membre de la classe de base est protégé OU public, vous pouvez appeler la fonction membre de la classe de base à partir de la classe dérivée. L'appel à la fonction membre non virtuelle et virtuelle de la classe de base à partir de la fonction membre dérivée peut être effectué. Veuillez vous référer au programme.
Production:
la source
virtual
!Appelez la méthode parent avec l'opérateur de résolution d'étendue parent.
la source
Exemple de référence.
la source