C ++ - уменьшение унаследованного объекта в форме ромба без RTTI / dynamic_cast
В настоящее время я работаю над интеграцией стороннего пакета, который использует множество материалов RTTI на платформе, отличной от RTTI (Android). По сути, я сделал свою собственную реализацию RTTI, но я застрял на проблеме.
Проблема заключается в том, что многие классы сталкиваются с проблемой наследования алмазов, поскольку все классы являются производными от одного базового класса (объекта) ... и поэтому, если я хочу перейти из базового класса в производный класс, я должен использовать a dynamic_cast - но RTTI недоступен! Как преобразовать объект из родительского в дочерний, если есть виртуальное наследование без dynamic_cast?
Это выглядит так:
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...
Это мои ошибки:
ошибка C2635: невозможно преобразовать 'A *' в 'D *'; подразумевается преобразование из виртуального базового класса
ошибка C2440: «инициализация»: невозможно преобразовать из «test_convert :: A *» в «test_convert :: D *». Преобразование из базы в производную требует dynamic_cast или static_cast
Есть идеи?