Я хотел посмотреть, можно ли создавать «интерфейсы», наследовать их, а затем проверять во время выполнения, реализует ли какой-либо случайный класс этот интерфейс. Вот что у меня есть:
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? Почему я не могу объявить класс «типом среды выполнения» или чем-то еще без виртуальных функций?