В настоящее время я работаю над интеграцией стороннего пакета, который использует множество материалов RTTI на платформе, отличной от RTTI (Android). В принципе, я сделал свою собственную RTTI-реализацию, но я застрял в проблеме.C++ - downcasting наследуемый объект с алмазной формой без RTTI/dynamic_cast
Проблема в том, что многие классы имеют проблему наследования алмазов, поскольку все классы производятся из одного и того же базового класса (объекта) .. и поэтому, если я хочу сбрасывать базовый класс в производный класс, Я должен использовать 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 :: А *» в «test_convert :: D *» Cast от основания к производным требует dynamic_cast или static_cast
Любые идеи?
Хех, хорошо MS просто говорит, чтобы удалить из ключевого слова виртуальное ключевое слово, и оно решит проблему. Посмотрите их документацию на ошибку, я не шучу. –
Hum ... ну, тогда это делает мне ошибку 2594 (см. Http://msdn.microsoft.com/en-us/library/5xata8be.aspx). Теперь, чтобы исправить это, они предлагают использовать последовательность преобразования, такую как «static_cast (static_cast (p));». Идея хорошая, но мы можем это сделать только тогда, когда точно знаем все дерево наследования .... и это не всегда так. Тем не менее, это предполагает, что виртуальный родительский класс может быть дублирован (в моем случае это нормально). Поэтому я попробую ... но для этого мне нужно найти способ получить иерархию от родительского до ребенка. –
Adam
Кто, черт возьми, сказал, что Android - это платформа, отличная от rtti? R5 и новый NDK должны поддерживать RTTI (я считаю, что вам нужно включить его с помощью '-frtti', но он должен работать тогда). Даже для более старых платформ, поскольку все это статически связано. –