2010-09-02 6 views
4

Je voudrais comprendre pourquoi quand j'appelle la méthode protégée, déclarée et implémentée en classe de base, de la classe dérivée via le pointeur vers la classe de base I, rencontre une erreur de compilation (C2248) et quand je l'appelle de la classe dérivée via le pointeur vers l'instance de classe dérivée, pass de compilation.Appel de la méthode protégée dans la classe de base via le pointeur sur la classe dérivée dans la classe dérivée

Je comprends qu'il fait partie de la langue, mais je veux comprendre pourquoi

Mon explication est que lorsque j'appelle un membre protégé de la classe de base par pointeur vers la classe de base en classe dérivée, la compilation échoue parce que l'héritage de La classe de base peut être protégée ou privée, mais quand je l'appelle via un pointeur sur une classe dérivée dans une classe dérivée c'est ok parce qu'elle fait partie de la classe. Est-ce vrai?

par exemple.

class Base 

{ 

protected: 

    virtual void func() {} 

} 

class Derived : public Base 

{ 

public: 

    virtual void myMethod() 

    { 

     Base* pBase = new Base; 

     pBase->func();   -> compilation error (C2248) 

     Derived* pDerived = new Derived; 

     pDerived->func();  -> O.K 

    } 
} 

Répondre

3

La ligne d'échec n'est pas compilable parce que vous accédez une instance de base - que les méthodes publiques sont accessibles de cette façon. Si vous faites cela dans myMethod():

Base::func(); 

devrait compiler parce que maintenant nous accédons la méthode héritée pour this. Un peu bizarre d'avoir pDerived::myMethod() appeler le constructeur Dérivé?

+0

Le fait que je ne peux pas accéder à une méthode protégée est compris la question est pourquoi quand j'appelle la même méthode mais via une instance de pDerived, elle compile? – David

+1

@David - Cela fonctionne parce que vous appelez l'instance depuis Derived :: myMethod() dans une autre instance de Derived. Toutes les instances de Derived ont le même accès aux méthodes d'une autre instance, comme si elles étaient les leurs. Si myMethod était une fonction globale, ou un membre d'une classe différente (pas 'Derived'), alors cela échouerait de la même façon que pour l'appel de Derived to Base. –

Questions connexes