referencia públicas protegidas privadas objeto hijo destructores derivadas derivada constructores clases clase c++ static derived access-specifier

c++ - públicas - constructores y destructores en clases derivadas



¿Puedo acceder a una clase base de miembros protegidos desde una función estática en una clase derivada? (2)

Tengo un programa donde necesito crear una clase base que se comparte entre un dll y algún código de aplicación. Luego tengo dos clases derivadas diferentes, una en la dll una en la aplicación principal. Cada uno de estos tiene algunas funciones miembro estáticas que operan en los datos en la clase nase. (Deben ser estáticos, ya que se utilizan como punteros de función en otros lugares). En su forma más simple mi problema se muestra a continuación.

class Base { protected: int var ; }; class Derived : public Base { static bool Process( Base *pBase ) { pBase->var = 2; return true; } };

Mi compilador se queja de que no puedo acceder a los miembros protegidos de pBase a pesar de que Derived tiene acceso protegido a Base. ¿Hay alguna forma de evitar esto o estoy malinterpretando algo? Puedo hacer públicas las variables de la Base, pero esto sería malo, ya que en mi caso real son un bulto de memoria asignada y los semáforos para protegerlo de multihilo.

¿Ayuda?


El especificador de acceso se aplica al identificador de la clase Derived (referencia / puntero / objeto) y no a los métodos de la clase Derived sí. Incluso si el método no fuera static , habría terminado con el mismo error. Porque no estás accediendo a var con el manejador derivado. Demo

La forma correcta es proporcionar un método setter :

class Base { protected: int var ; public: void setVar(const int v) { var = v; } // <--- add this method };

Nota: hay una salida más, pero no estoy seguro de si es elegante.

(static_cast<Derived*>(pBase))->var = 2;


En general (independientemente de si la función es estática o no), una función miembro de la clase derivada solo puede acceder a miembros de clase base protegidos de objetos de su tipo. No puede acceder a los miembros protegidos de la base si el tipo estático no es el de la clase derivada (o una clase derivada de ella). Asi que:

class Base { protected: int var; } ; class Derived : public Base { static void f1( Derived* pDerived ) { pDerived->var = 2; // legal, access through Derived... } static bool Process( Base *pBase ) { pBase->var = 2 ; // illegal, access not through Derived... } } ;