Me encontré con este problema accidentalmente cuando revisaba la herencia y hacia arriba/abajo de la transmisión. ¿Por qué no está permitido (el código está comentado para mostrar secciones que no están permitidas)? Ahora puedo adivinar por qué no está permitido, pero una respuesta objetiva sería genial.Casting de herencia privada/protegida
En cuanto al código que se animales, sé que es porque (Base *) es una conversión de estilo C, que es esencialmente un reinterpret_cast en C++ que a su vez significa que en este caso lo hará da como resultado un comportamiento indefinido. Por favor, corríjame si estoy equivocado.
class Base
{
};
class Derived : public Base
{
};
class DerivedProt : protected Base
{
};
class DerivedPriv : private Base
{
};
int main()
{
Base* a = new Derived();
Base* b = new DerivedProt(); // Not allowed
Base* c = new DerivedPriv(); // Not allowed
Base* d = (Base*) new DerivedProt(); // Allowed but undefined behavior...?
Base* e = (Base*) new DerivedPriv(); // Allowed but undefined behavior...?
}
Incluso si no se trata de un comportamiento indefinido, sigue siendo una idea increíblemente mala y debe evitarse. Una cosa que es muy peligrosa sobre este elenco es que el compilador intentará hacerlo incluso cuando no haya una relación de herencia y ni siquiera genere una advertencia. –
Tuve que verificar con Comeau en línea para ver si mi compilador se equivocó. No, reinterpret_cast <> puede hacer esto también. –
@HansPassant Pero 'reinterpret_cast' no conoce ni se preocupa por las clases base. No se puede usar para moldes hacia arriba o hacia abajo. – curiousguy