Quelles sont les règles d'accessibilité lorsque les fonctions virtuelles sont déclarées sous 3 spécificateurs d'accès différents spécifiés par C++ (public, private, protected) Quelle est la signification de chacun? Tout exemple de code simple pour expliquer le concept sera très utile.Spécificateurs d'accès et fonctions virtuelles
Répondre
Les spécificateurs d'accès s'appliquent de la même manière qu'ils le feraient à tout autre nom lors de la recherche de noms. Le fait que la fonction soit virtuelle n'a aucune importance.
Il y a une erreur commune qui se produit parfois en ce qui concerne les fonctions virtuelles.
Si la recherche de nom détermine qu'une fonction viable est une fonction virtuelle, le spécificateur d'accès de la fonction virtuelle est vérifié dans la portée du type statique de l'expression d'objet utilisée pour nommer la fonction. Au moment de l'exécution, la fonction réelle à appeler pourrait être définie dans la classe dérivée avec un spécificateur d'accès complètement différent. C'est parce que les «spécificateurs d'accès» sont un phénomonon de compilation.
// Brain compiled code ahead
struct A{
virtual void f() {}
private:
virtual void g() {}
protected:
virtual void h() {}
};
struct B : A{
private:
virtual void f() {} // Allowed, but not a good habit I guess!
};
B b;
A &ra = b;
ra.f(); // name lookup of 'f' is done in 'A' and found to be public. Compilation
// succeeds and the call is dynamically bound
// At run time the actual function to be called is 'B::f' which could be private, protected etc but that does not matter
Merci! Belle explication. –
"Cerveau compilé code avant" lol c'est le modèle @ sbi. Peut-être que je devrais commencer avec ce genre d'introduction aussi pour mes codes. Trop souvent, il arrive que mon code est mort de cerveau –
@Johannes Schaub - litb: :), – Chubsdad
Les fonctions virtuelles sont comme les fonctions régulières (à l'exception des virtual purs) lorsqu'elles sont utilisées dans la classe de base.
Résumer du haut de ma tête:
fonctions publiques sont accessibles par quiconque. fonctions privées peuvent être accessibles seulement être la classe et ses amis fonctions protégées sont comme les privés, seulement ils peuvent être accessibles par des classes dérivées.
Public est l'interface, et les fonctions privées/protégées sont les internes. Notez également que toutes les variables locales (en fonction de l'encapsulation) doivent être protégées/privées.
Maintenant, en ce qui concerne les classes dérivées, vous dérivez une classe comme ceci:
class A : [public | protected | private] B
{
};
Maintenant, le public/qualificatif privé/protégé Infront de B indique le niveau le moins de sécurité restrictive pour hériter de la base classe. Ce n'est pas un "filtre" pour les méthodes et les variables locales dans le sens où certaines ne sont pas héritées, cela change simplement leur niveau de sécurité à celui spécifié si elles sont moins restreintes (plus public).
Alors class A : public B
va laisser les membres de la base hérités comme ils sont tandis que, class A : private B
va les changer tous les membres privés.
Espérons que cela a du sens pour vous et répond à votre question. Sinon, dis-moi!
- 1. C++ fonctions virtuelles Question
- 2. fonctions virtuelles objet Slicing
- 3. fonctions virtuelles pures
- 4. Héritage de diamant et fonctions virtuelles pures
- 5. C++ Déclaration avant et fonctions virtuelles pures
- 6. erreur faisant C++ fonctions virtuelles
- 7. Comment cela fonctionnera-t-il? (interfaces et fonctions non virtuelles)
- 8. Test de surcharge des fonctions virtuelles
- 9. Motif de commande sans fonctions virtuelles (C++)
- 10. Surcharge de l'héritage C++ sans fonctions virtuelles
- 11. fluentnhibernate et entités virtuelles
- 12. Décorateurs et méthodes virtuelles
- 13. format printf spécificateurs pour uint32_t et size_t
- 14. Comment trouver des fonctions virtuelles non définies d'une classe
- 15. débutant C++: fonctions virtuelles dans une classe de base
- 16. Résolvez les fonctions virtuelles C++ de la classe de base
- 17. fonctions prioritaires virtuelles C++ avec le même nom
- 18. Quelles fonctions doivent être virtuelles pour générer des éléments spécifiques?
- 19. Question d'entrevue sur les fonctions virtuelles en C++
- 20. Substitution de fonctions virtuelles publiques avec des fonctions privées en C++
- 21. La surcharge de plusieurs fonctions n'est-elle pas autorisée avec les fonctions virtuelles?
- 22. méthodes virtuelles et classes de modèles
- 23. C++, programmation générique et fonctions virtuelles. Comment puis-je obtenir ce que je veux?
- 24. buildly night et les machines virtuelles
- 25. Chaîne de format utilisant plusieurs spécificateurs
- 26. spécificateurs de nom de fichier en PHP
- 27. Migration de machines virtuelles
- 28. Machines virtuelles préconfigurées?
- 29. nhibernate méthodes virtuelles & resharper
- 30. Comment exporter des fonctions virtuelles pures à partir d'une DLL en C++?
accès –