С++. Как вызвать метод потомка, извлечённого из 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
194 +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 Апр 2024 в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир