Получение "тип источника не является полиморфным" при попытке использовать динамическое приведение


struct A {};

struct B : A {};

int main()
{
    A* a = new B();

    B* b = dynamic_cast<B*>(a);
}

выдает:

не динамическое приведение dynamic_cast 'а' (типа 'struct а*'), чтобы типа 'struct Б*' (типа источник не полиморфными)

Как я могу сделать A полиморфные? Я хочу безопасно бросить его в B.

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

3   51   2013-02-27 18:05:58

3 ответа:

вы должны сделать A полиморфный, что вы можете сделать, добавив virtual деструктор или любая виртуальная функция:

struct A {
  virtual ~A() = default;
};

или, до C++11

struct A {
  virtual ~A() {}
};

обратите внимание, что полиморфный тип должен иметь виртуальный деструктор в любом случае, если вы собираетесь безопасно вызывать delete на экземплярах производного типа через указатель на базу.

вам нужно хотя бы virtual функция-как правило, если другие не подходят, деструктор:

struct A {
   virtual ~A() {}
}; 

как говорит ваш компилятор, ваш тип A не полиморфные. Вы должны добавить