Действительно ли dynamic_cast работает для множественного наследования?

Я хотел посмотреть, можно ли создавать «интерфейсы», наследовать их, а затем проверять во время выполнения, реализует ли какой-либо случайный класс этот интерфейс. Вот что у меня есть:

struct GameObject {
    int x,y;
    std::string name;

    virtual void blah() { };
};

struct Airholder {
   int oxygen;
   int nitrogen;
};

struct Turf : public GameObject, public Airholder {
   Turf() : GameObject() {
      name = "Turf";
   }

   void blah() { };
};

void remove_air(GameObject* o) {
   Airholder* a = dynamic_cast<Airholder*>(o);
   if(!a) return;
   a->oxygen   = 0;
   a->nitrogen = 0;
};

Теперь это работает. В документации написано, что это работает, тестовый пример работает ... Но также он не компилировался, пока я не добавил виртуальный метод в GameObject. Дело в том, что я действительно не знаю, предназначена ли эта функция для такого использования. Что заставило меня задуматься, так это тот факт, что я должен объявить виртуальную функцию для проверяемого класса. Но очевидно, что их нет, проверяемый мной класс не имеет виртуальных функций, на самом деле весь мой код не имеет ничего общего с виртуальными функциями, это совершенно другой подход.

Итак, я предполагаю, что мой вопрос: если то, что я делаю, действительно работает, зачем мне виртуальная функция, чтобы дать моему классу vtable? Почему я не могу объявить класс «типом среды выполнения» или чем-то еще без виртуальных функций?

6
задан xaxxon 25 October 2016 в 22:34
поделиться