Сбой dynamic_cast при приведении из базового в дочерний класс

У меня есть структура

struct foo : public std::map<std::string, int>
{
};

и дочерняя структура;

struct bar : public foo
{
    int another_member;
}

Но я не могу использовать bar* b = dynamic_cast<bar*>(f) где f указатель на foo.

Даже если я рефакторинг foo в

struct foo
{
     std::map<std::string, int> m;
};

У меня все еще есть проблема. Я поиграл с настройками RTTI безрезультатно. Что на земле происходит?

Ошибка:

ошибка C2683: "dynamic_cast": "Credit::WaterfallSimulationResult" не является полиморфным типом

1 ответ

Решение

dynamic_cast будет работать только на полиморфных типах, то есть structс или classЕсли у них есть таблица виртуальных функций.

Лучше всего внедрить виртуальную функцию в вашу базу structи лучшая функция для представления - это виртуальный деструктор, который, пожалуй, в любом случае полезен:

struct foo
{
     std::map<std::string, int> m;
     virtual ~foo(){};
};

Обратите внимание, что это заставляет вас использовать вашу "рефакторированную" форму fooКонтейнеры STL не предназначены для использования в качестве базовых классов.

Другие вопросы по тегам