Получение типа источника не является полиморфным при попытке использовать dynamic_cast
struct A {};
struct B : A {};
int main()
{
A* a = new B();
B* b = dynamic_cast<B*>(a);
}
дает:
не может dynamic_cast 'a' (типа 'struct A *') набрать 'struct B *' (исходный тип не является полиморфным)
Как я могу сделать A
полиморфные? Я хочу смело бросить это Б.
(Один из способов - добавить фиктивную виртуальную функцию, но есть ли лучший способ?)
Ответы
Ответ 1
Вам нужно сделать A
polymorphic, что вы можете сделать, добавив деструктор virtual
или любую виртуальную функцию:
struct A {
virtual ~A() = default;
};
или, прежде чем С++ 11,
struct A {
virtual ~A() {}
};
Обратите внимание, что полиморфный тип должен иметь виртуальный деструктор в любом случае, если вы намерены безопасно вызывать удаление экземпляров производного типа с помощью указателя на базу.
Ответ 2
Вам нужна хотя бы функция virtual
- обычно, если другие не подходят, деструктор:
struct A {
virtual ~A() {}
};
Ответ 3
Как говорит ваш компилятор, ваш тип A
не является полиморфным. Вы должны добавить virtual
функцию к нему. Например, virtual
деструктор может быть хорошим выбором:
struct A { virtual ~A() { } };
// ^^^^^^^ This makes A a polymorphic type
struct B : A {};
int main()
{
A* a = new B();
B* b = dynamic_cast<B*>(a); // Should work now
}