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



struct A {};

struct B : A {};

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

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


выдает:




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




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



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

661   3  

3 ответов:

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

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

или, до C++11

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

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

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

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

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

Comments

    Ничего не найдено.