Estoy tratando de evitar que una clase pueda convertir su puntero 'this' en un puntero de una de sus interfaces. Lo hago usando herencia privada a través de una clase proxy intermedia. El problema es que encuentro que la herencia privada hace que todos los miembros estáticos públicos y los tipos de la clase base sean inaccesibles para todas las clases bajo la clase heredada en la jerarquía.C++ herencia privada y miembros/tipos estáticos
class Base
{
public:
enum Enum
{
value
};
};
class Middle : private Base
{
};
class Child : public Middle
{
public:
void Method()
{
Base::Enum e = Base::value; // doesn't compile BAD!
Base* base = this; // doesn't compile GOOD!
}
};
He intentado esto tanto en VS2008 (la versión requerida) como en VS2010, tampoco funciona.
¿Alguien puede pensar en una solución? ¿O un enfoque diferente para detener la conversión?
También soy curioso sobre el comportamiento, ¿es solo un efecto secundario de la implementación del compilador, o es por diseño? Si por diseño, ¿por qué? Siempre he pensado que la herencia privada significa que nadie sabe que Middle hereda de Base. Sin embargo, el comportamiento exhibido implica que la herencia privada significa mucho más que eso, de hecho, Child tiene menos acceso a Base que cualquier espacio de nombres que no esté en la jerarquía de clases.
+1: una pregunta muy interesante, de hecho. –