С++. Как вызвать метод потомка, извлечённого из std::vector? Суть - есть, скажем, класс CBaseObject с методом DoAnything. В нём производятся какие-то подготовительные действия, общие для потомков.
Есть CChildObject, в котором DoAnything вызывает родительский и делает какие-то полезные действия.
И, допустим, CStarter, одна из задач которого - обработать кучу CBaseObject-х потомков (возможно и другие типов, не только CChildObject).
Как контейнер вроде бы вполне удобно использовать std::vector, но - т.к. заранее известно только что мы запустим DoAnything у потомка CBaseObject, то объявлен он как std::vector toRun;
При этом запускается CBaseObject-й метод (как я понимаю ), а нужно - потомка.
Вопрос - как это обойти с наименьшим числом костылей?
p.s. visual studio 2013

21 Авг 2019 в 07:09
159 +1
1
Ответы
1

Для вызова метода потомка из объекта базового класса, извлеченного из std::vector, можно воспользоваться механизмом позднего связывания или виртуальными функциями. Для этого вам нужно объявить метод DoAnything в классе CBaseObject как виртуальный и реализовать его в классе CChildObject. Например:

#include <iostream>
#include <vector>
class CBaseObject {
public:
virtual void DoAnything() {
std::cout << "DoAnything in CBaseObject" << std::endl;
}
};
class CChildObject : public CBaseObject {
public:
void DoAnything() override {
CBaseObject::DoAnything();
std::cout << "DoAnything in CChildObject" << std::endl;
}
};
int main() {
std::vector<CBaseObject*> toRun;
CChildObject childObj;
toRun.push_back(&childObj);
for (CBaseObject* obj : toRun) {
obj->DoAnything();
}
return 0;
}

В данном примере метод DoAnything объявлен как виртуальный в CBaseObject и переопределен в классе CChildObject. При вызове метода через указатель на объект базового класса из std::vector будет вызываться метод потомка.

20 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 541 автору
Первые отклики появятся уже в течение 10 минут
Прямой эфир