c++ - publicas - no se puede llamar a las funciones protegidas de la clase base?
clases bases publicas protegidas y privadas (1)
No puedo llamar a la función protegida en mi clase base. ¿Por qué? Se ve algo como esto:
class B : B2
{
public:
virtual f1(B*)=0;
protected:
virtual f2(B*) { codehere(); }
}
class D : public B
{
public:
virtual f1(B*b) { return f2(b); }
protected:
virtual f2(B*b) { return b->f2(this); }
}
En msvc obtengo el error de error C2248: ''nombre :: clase :: f2'': no se puede acceder al miembro protegido declarado en clase ''nombre :: clase''
En gcc obtengo un error: ''virtual int name :: class :: f2 ()'' está protegido.
¿Porqué es eso? Pensé que el objetivo de los miembros protegidos es llamar a las clases derivadas.
Las funciones miembro protegidas solo se pueden llamar dentro de la clase base o en su clase derivada. No puedes llamarlos fuera de tu clase. Llamada externa significa llamar a una función miembro de una variable de tipo clase.
Asi que
virtual f1(B*b) { return f2(b); }
está bien, porque f2 opera en la clase misma. (llamado adentro)
Pero
virtual f2(B*b) { return b->f2(this); }
no compilará, porque f2 opera en b y no en la clase D en sí misma. (llamado afuera) Es ilegal.
Para solucionarlo, B :: f2 debe ser público.