8
votes

Accéder à une fonction de membre privé dérivé d'un pointeur de classe de base à un objet dérivé

Dupliqué possible:
Pourquoi puis-je accéder à une fonction de membre privé dérivé via un pointeur de classe de base à un objet dérivé? xxx

pourquoi p-> fn2 () appelez la fonction de classe dérivée même si fn2 est privé dans d ?


6 commentaires

Section 11.6 en C ++ 99. Aussi fn1 in D sera également privé par défaut car non spécifié.


@Georg: exemple intéressant de la manière dont les titres de la question des déchets aident à briser le débordement de la pile. Le titre de cette question est génial.


@Tomalak Geret'kal Vous pouvez toujours modifier l'autre question pour utiliser le même titre. Je pense faire ça maintenant. Qu'est-ce que tu penses?


@Georg: Bravo: D Je vote pour fermer cette question comme DUP, avec quelque chose d'un cœur lourd. Désolé Balas.


@Hosam: C'est déjà fait.


@Sasquiha: Y a-t-il quelque chose appelé C ++ 99 ??


4 Réponses :


5
votes

modificateurs d'accès, tels que public , privé et protégé ne sont appliqués que pendant la compilation. Lorsque vous appelez la fonction via un pointeur sur la classe de base, le compilateur ne sait pas que le pointeur pointe vers une instance de la classe dérivée. Selon les règles, le compilateur peut déduire de cette expression, cet appel est valide.

C'est généralement une erreur sémantique de réduire la visibilité d'un membre dans une classe dérivée. Les langages de programmation modernes tels que Java et C # refusent de compiler ce code, car un membre visible dans la classe de base est toujours accessible dans la classe dérivée via un pointeur de base.


0 commentaires

0
votes

L'appel p-> fn2 () est évalué au moment de l'exécution en fonction du type de but indiqué par p . Au moment de la compilation, la compile voit le p-> fn2 () appel comme appel à b :: fn2 () et puisque b :: fn2 () est public que le compilateur ne signalait que l'erreur. Il est seulement à l'exécution que l'appel de fonction réelle d :: fn2 () est évalué.

Cela ne casse pas le principe encapsulation Ceci est une fonctionnalité de C ++ appelé polymorphisme d'exécution ou polymorphisme dynamique


0 commentaires

-2
votes

de Wikipedia :

en oop quand une classe dérivée hérite d'un classe de base, un objet de la dérive la classe peut être appelée (ou couler) comme être le type de classe de base ou le type de classe dérivé. S'il y a méthodes de classe de base remplacées par le classe dérivée, l'appel de la méthode Le comportement est ambigu.

la distinction entre virtuel et Non virtuel résout cette ambiguïté. Si la fonction en question est "Virtual" désigné dans la classe de base Puis la fonction de classe dérivée serait appelé (s'il existe). Si ça n'est pas virtuel, la classe de base est la fonction serait appelée.

hth.


2 commentaires

Cela ne répond pas à la question de l'OP sur les modificateurs d'accès.


Et nous n'écrivons pas les signatures à ce sujet.



0
votes

Lorsque vous faites p = nouveau d , p -> __ vfptr est maintenant pointé vers le début de la table de fonction virtuelle de d . Et comme cela se produit au moment de l'exécution, les spécificateurs d'accès n'entrent donc pas en jeu.


2 commentaires

Les tables de fonction virtuelles sont un détail de mise en œuvre.


VPTR & VTBL Les détails de la mise en œuvre du compilateur sont donc une explication en termes d'entre eux n'est pas la meilleure approche.