С классами B
и производного классом D
:Причина, почему dynamic_cast не работает с не полиморфными типами
class B {
int b;
};
class D : public B {
int d;
};
D* d = new D();
B* b = dynamic_cast<B*>(d);
выше будет работать нормально — это просто приведение к базовому типу. Мы уверены, что все, что указывает b
, имеет объект класса B
(суб).
Однако
B* b = new D();
D* d = dynamic_cast<D*>(b);
не будет компилировать, хотя b
указывает на правильный D
экземпляра — поскольку базовый класс не является полиморфным. Поэтому добавление только одного пустого виртуального метода решит проблему.
Важный вопрос, почему C++ требует типа источника полиморфных? Единственное объяснение, которое я нашел, это this, но он просто утверждает, что «потому что так оно реализовано внутренне» - по крайней мере, на моих глазах). У людей, которые спроектировали dynamic_cast
, возможно, были и другие причины - что это было?
Я не вижу ничего динамически полиморфный. В базовом классе вы потеряли хотя бы «виртуальный» деструктор. –
Пожалуйста, используйте компилятор, прежде чем отправлять код с ошибками. –
@ DieterLücking Достаточно, но точный код здесь не является существенной. Я бы сказал, этого было достаточно, чтобы продемонстрировать намерение. – Angew