2010-09-24 4 views
1

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

+0

accès –

Répondre

8

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 
+0

Merci! Belle explication. –

+0

"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 –

+0

@Johannes Schaub - litb: :), – Chubsdad

0

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!

Questions connexes