Appelant la méthode privée en C ++
C'est purement une question théorique, je sais que si l'on déclare une méthode privée, vous ne devriez probablement pas l'appeler. J'ai réussi à appeler privé virtuel des méthodes et des changements de membres privés pour les instances, mais je ne peux pas comprendre comment appeler une méthode virtuelle (sans l'aide de __asm
). Est-il un moyen d'obtenir le pointeur de la méthode? Existe-il d'autres façons de le faire?
EDIT: je ne veux pas changer la définition de la classe! Je veux juste un hack/solution de contournement. 🙂
source d'informationauteur Luchian Grigore
Vous devez vous connecter pour publier un commentaire.
#include
le fichier d'en-tête, mais:Clairement, vous aurez besoin pour obtenir autour de divers inclusion gardes etc et ce, dans un isolé unité de compilation.
EDIT:
Encore hackish, mais moins:
Voir mon blog. Je vais reposter le code ici
En classe avec les membres privés
Et la façon d'y accéder
Il peut être appelée que si un
public
fonction retourne l'adresse de laprivate
fonction, alors n'importe qui peut utiliser cette adresse pour appeler la fonction privée.Exemple,
De sortie:
Démo à ideone : http://www.ideone.com/zkAw3
Vous avez ami des classes et des fonctions.
Le point n'est pas "tu ne devrais pas l'appeler", c'est juste "vous ne pouvez pas l'appeler". Que sur la terre qui sont que vous essayez de faire?
La façon la plus simple:
Appel de la méthode privée à partir d'une fonction publique de la même classe.
De suivi de la T. E. D. de répondre: Ne pas modifier l'en-tête. Au lieu de créer votre propre copie de l'en-tête et insérer des
friend
déclarations que le faux copie de l'en-tête. Dans votre code source,#include
ce faux-tête plutôt que de la vraie. Voila!Modification du privé au public, pourrait changer la faiblesse des symboles qui sont le résultat de méthodes inline, qui à son tour pourrait provoquer l'éditeur de liens pour se plaindre. La faiblesse des symboles qui sont le résultat de méthodes inline aura les mêmes signatures avec le faux et le vrai-têtes si tout ce qui est fait est d'ajouter quelques ami déclarations. Avec ces ami déclarations, vous pouvez maintenant faire toutes sortes de mauvaises choses avec la classe telles que l'accès aux données privées et en appelant les membres privés.
Additif
Cette approche ne fonctionnera pas si l'en-tête en question utilise
#pragma once
au lieu d'un#include
garde pour assurer l'en-tête est idempotent.Bien, le moyen le plus évident serait de modifier le code de sorte qu'il n'est plus privé.
Si vous insistez sur la recherche d'un mal façon de le faire...eh bien...avec certains compilateurs il peut fonctionner à créer votre propre version du fichier d'en-tête où une méthode est
public
au lieu deprivate
. Le mal a une mauvaise façon de rebondir sur vous (c'est pourquoi nous l'appelons "le mal").Je pense que le plus proche que vous obtiendrez à un hack est-cemais ce n'est pas seulement imprudent, mais comportement indéfini de sorte qu'il n'a pas de sémantique. Si elle arrive à fonctionner de la manière que vous voulez pour n'importe quel programme unique invocation, alors que c'est un pur hasard.
Définir une catégorie similaire, qui est le même en dehors de la fonction publique.
Puis transtypage d'un objet avec la fonction privée à la fonction publique, vous pouvez ensuite appeler la fonction publique.
Si nous parlons de MSVC, je pense que la façon la plus simple avec aucune autre mal que le fait d'appeler une méthode privée elle-même est le grand __asm:
Pour GCC, il peut être fait en utilisant une déformation du nom d'une fonction.
Les noms déformés peut être trouvé en nm *.o fichiers.
Ajoutez -masm=intel option du compilateur
Sources: GCC erreur: Ne peut pas appliquer offsetof à la fonction de membre de MyClass::Mafonction
https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html