Как сделать объект или указатель базового класса, который может обращаться ко всем методам дочерних классов? У меня есть базовый класс wall, у которого есть координаты и текстура, есть его дочерний класс door, у которого есть координаты, текстура и метод open. У меня есть vector с объектами типа wall, в котором есть объекты типа door, мне нужно из этого vector'а вызвать метод open у всех объектов класса door.
Для этого вам нужно воспользоваться механизмом полиморфизма в C++. Полиморфизм позволяет вызывать методы на объектах базового класса, которые на самом деле являются объектами дочерних классов.
Прежде всего, у вас должны быть виртуальные методы в базовом классе wall, которые будут переопределены в дочернем классе door. Например, добавьте в класс wall следующий виртуальный метод:
class wall public virtual void open() {} // виртуальный метод, который будет переопределен в дочернем классе doo };
Затем переопределите метод open в дочернем классе door:
class door : public wall public void open() override // реализация метода open для класса doo
};
Теперь у вас есть виртуальный метод open в базовом классе wall, который будет переопределен в дочернем классе door.
Далее, чтобы вызвать метод open для объектов класса door, находящихся в вашем векторе, пройдитесь по всем элементам вектора и проверьте, принадлежит ли текущий объект к классу door. Если да, то вызовите метод open:
std::vector<wall*> walls; // ваш вектор с объектами типа wal for(wall* w : walls) door* d = dynamic_cast<door*>(w); // пытаемся привести объект к классу doo if(d) { // если успешно привели к классу doo d->open(); // вызываем метод open для объекта класса doo
}
Этот способ позволит вам вызвать метод open для всех объектов класса door, находящихся в вашем векторе walls.
Для этого вам нужно воспользоваться механизмом полиморфизма в C++. Полиморфизм позволяет вызывать методы на объектах базового класса, которые на самом деле являются объектами дочерних классов.
Прежде всего, у вас должны быть виртуальные методы в базовом классе wall, которые будут переопределены в дочернем классе door. Например, добавьте в класс wall следующий виртуальный метод:
class wallpublic
virtual void open() {} // виртуальный метод, который будет переопределен в дочернем классе doo
};
Затем переопределите метод open в дочернем классе door:
class door : public wallpublic
void open() override
// реализация метода open для класса doo
};
Теперь у вас есть виртуальный метод open в базовом классе wall, который будет переопределен в дочернем классе door.
Далее, чтобы вызвать метод open для объектов класса door, находящихся в вашем векторе, пройдитесь по всем элементам вектора и проверьте, принадлежит ли текущий объект к классу door. Если да, то вызовите метод open:
std::vector<wall*> walls; // ваш вектор с объектами типа walfor(wall* w : walls)
door* d = dynamic_cast<door*>(w); // пытаемся привести объект к классу doo
if(d) { // если успешно привели к классу doo
d->open(); // вызываем метод open для объекта класса doo
}
Этот способ позволит вам вызвать метод open для всех объектов класса door, находящихся в вашем векторе walls.