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