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
}
}
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
@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. –