В настоящее время я работаю над интеграцией стороннего пакета, который использует множество материалов RTTI на платформе, отличной от RTTI (Android). В принципе, я сделал свою собственную RTTI-реализацию, но я застрял в проблеме.
Проблема заключается в том, что у многих классов есть проблема наследования алмазов, поскольку все классы производятся из одного и того же базового класса (объекта).. и поэтому, если я хочу сбрасывать из базового класса в производный класс, я должны использовать 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: 'initializing': невозможно преобразовать из 'test_convert:: A *' в 'test_convert:: D *' Для трансляции из базы в производную требуется dynamic_cast или static_cast
Любые идеи?