2009-01-25 16 views
7

No puedo llamar a la función protegida en mi clase base. ¿Por qué? Se ve algo como esto:no puede llamar a funciones protegidas de clase base?

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 me sale el error C2248 de error: 'nombre de la clase :: :: f2': no ​​se puede acceder miembro protegido declarado en la clase ':: Nombre de la clase'

En gcc Obtengo el error: 'virtual int name :: class :: f2()' está protegido.

¿Por qué es eso? Pensé que el objetivo de los miembros protegidos es llamar a las clases derivadas.

+0

Al menos agregue código que compilará y generará los errores que desea que solucionemos. El código anterior tiene tantos otros errores de sintaxis que resolver su problema se vuelve irracional. –

+0

estoy de acuerdo con Martin. si quieres que te ayudemos, invierte algo de tiempo en hacer que tu código sea C++ (sin omitir los tipos de retorno, punto y coma, etc.) –

Respuesta

15

Las funciones miembro protegidas solo pueden invocarse 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.

Así

virtual f1(B*b) { return f2(b); } 

está bien, porque f2 opera en la propia clase. (Denominado en el interior)

Pero

virtual f2(B*b) { return b->f2(this); } 

no se compilará, porque f2 no ​​funciona en la propia clase B D. (llamado afuera) Es ilegal.

Para solucionarlo, B :: f2 debe ser público.

+0

Pregunta, ¿hay alguna forma de evitar esto, vengo del mundo administrado, donde esto está permitido y yo Lo encuentro muy útil, realmente no quiero hacer que estas cosas privadas sean internas, pero si no hay forma de evitarlo, supongo que tengo que hacerlo. ¿Es posible hacer que la clase sea amiga de sí misma? –

+0

John, haz que f2 sea público o declares que D es amigo de B. No conozco otra forma. – OldPeculier

Cuestiones relacionadas