Как сделать объект или указатель базового класса, который может обращаться ко всем методам дочерних классов?

У меня есть базовый класс wall, у которого есть координаты и текстура, есть его дочерний класс door, у которого есть координаты, текстура и метод open. У меня есть vector с объектами типа wall, в котором есть объекты типа door, мне нужно из этого vector'а вызвать метод open у всех объектов класса door.
  • Вопрос задан
  • 518 просмотров
Решения вопроса 1
Связка typeid + dynamic_cast

#include <iostream>
#include <vector>
#include <random>
#include <typeinfo>

using namespace std;

class Foo {
	public:
		virtual ~Foo(){}
};

class Bar: public Foo {
	private:
		size_t c;
		static size_t n;
	
	public:
		Bar(): c(n++){};
		virtual ~Bar(){};
		size_t getC() const {return c;};
};

size_t Bar::n(0);

int main() {
	
    std::mt19937 gen;
    std::uniform_int_distribution<unsigned> dis(0, 2);
    
    vector<Foo*> vec;
    
    for(size_t i = 0; i < 100; ++i) {
    	if(dis(gen))
    		vec.push_back(new Foo);
    	else
    		vec.push_back(new Bar);
    }
    
    for(auto p: vec) {
    	if(typeid(*p) == typeid(Bar))
    		cout << dynamic_cast<Bar*>(p)->getC() << endl;
    }
    
     for(auto p: vec)
     	delete p;
	
	return 0;
}


Можно обойтись одним dynamic_cast, но тогда придётся обрабатывать исключения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
В wall сделайте виртуальный метод open с тривиальной реализацией (например retrurn 0;), который затем в door переопределите.
При вызове виртуального метода по указателю/ссылке на базовый класс будет вызван метод соответствующего дочернего класса без танцев с бубном.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы