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