Подтвердить что ты не робот

Получение типа источника не является полиморфным при попытке использовать 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 полиморфные? Я хочу смело бросить это Б.

(Один из способов - добавить фиктивную виртуальную функцию, но есть ли лучший способ?)

4b9b3361

Ответ 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
}