una publicas protegidas programacion privadas orientada objetos miembros clases clase bases c++ inheritance

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.