Actualmente estoy trabajando en la integración de un paquete de terceros que usa muchas cosas de RTTI en una plataforma que no es RTTI (Android). Básicamente, hice mi propia implementación RTTI pero estoy atascado en un problema.C++: descifrar un objeto heredado en forma de diamante sin RTTI/dynamic_cast
El problema es que muchas clases tienen el problema de herencia de diamantes ya que todas las clases derivan de la misma clase base (objeto) ... y entonces, si quiero bajar de la clase base a la clase derivada, Tengo que usar un dynamic_cast - ¡pero RTTI no está disponible! ¿Cómo convierto un objeto de principal a secundario cuando hay herencia virtual sin dynamic_cast?
Parece que:
class A
{
public:
virtual char* func() { return "A"; };
};
class B : public virtual A
{
public:
//virtual char* func() { return "B"; };
};
class C : public virtual A
{
public:
//virtual char* func() { return "C"; };
};
class D : public B, public C
{
public:
//virtual char* func() { return "D"; };
};
D d;
A* pa = static_cast<A*>(&d);
D* pd = static_cast<D*>(pa); // can't do that! dynamic_cast does work though...
Esos son mis errores:
error C2635: no se puede convertir un 'A *' a una 'D *'; conversión de una clase base virtual está implícito
error C2440: 'inicialización': no se puede convertir de 'test_convert :: A *' a 'test_convert :: D *' moldeada desde la base hasta deriva requiere dynamic_cast o static_cast
¿Alguna idea?
heh, bueno MS acaba de decir que elimine la palabra clave virtual del código y resolverá el problema. Ver su documentación para el error, no estoy bromeando. –
Hum ... bien, hacer eso me da el error 2594 (ver http://msdn.microsoft.com/en-us/library/5xata8be.aspx). Ahora, para solucionarlo, sugieren utilizar una secuencia de conversión como "static_cast (static_cast (p));". La idea es buena, pero solo podemos hacer eso cuando conocemos exactamente todo el árbol de herencia ... y ese no es siempre el caso. Aún así, esto supone que la clase principal virtual se puede duplicar (en mi caso está bien). Así que lo probaré ... pero para hacerlo, tendré que encontrar la manera de obtener la jerarquía de padres a hijos. –
Adam
¿Quién demonios te dijo que Android es una plataforma que no es rtti? El NDK r5 y más nuevo debería ser compatible con RTTI (creo que debes activarlo con '-frtti', pero debería funcionar entonces). Incluso para plataformas más antiguas, ya que está todo vinculado estáticamente. –