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

Есть идеи?

Ответы на вопрос(6)

Ваш ответ на вопрос