#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Object {
public:
virtual void input(istream& is) {
cout << "input from base"<<endl;
}
};
class Derived : public Object {
public:
void input (istream& is) override {
cout << "input from derived"<<endl;
}
};
std::vector<std::shared_ptr<Object>> arr;
bool InputArray(std::shared_ptr<Object> obj) {
//...
obj->input(cin);
arr.push_back(obj); // no need for nelem. Use arr.size() instead
return true;
}
int main() {
shared_ptr<Object> p1 = make_shared<Object>(), p2 = make_shared<Derived>();
InputArray (p1);
InputArray (p2);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIE9iamVjdCB7CnB1YmxpYzogCgl2aXJ0dWFsIHZvaWQgaW5wdXQoaXN0cmVhbSYgaXMpIHsKCQljb3V0IDw8ICJpbnB1dCBmcm9tIGJhc2UiPDxlbmRsOyAKCX0KfTsKY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBPYmplY3QgewpwdWJsaWM6IAoJdm9pZCBpbnB1dCAoaXN0cmVhbSYgaXMpIG92ZXJyaWRlIHsKCQljb3V0IDw8ICJpbnB1dCBmcm9tIGRlcml2ZWQiPDxlbmRsOyAKCX0KfTsKCnN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxPYmplY3Q+PiBhcnI7Cgpib29sIElucHV0QXJyYXkoc3RkOjpzaGFyZWRfcHRyPE9iamVjdD4gb2JqKSB7CiAgICAvLy4uLgogICAgb2JqLT5pbnB1dChjaW4pOwogICAgYXJyLnB1c2hfYmFjayhvYmopOyAgLy8gbm8gbmVlZCBmb3IgbmVsZW0uICBVc2UgYXJyLnNpemUoKSBpbnN0ZWFkCiAgICByZXR1cm4gdHJ1ZTsKfQoKaW50IG1haW4oKSB7CglzaGFyZWRfcHRyPE9iamVjdD4gcDEgPSBtYWtlX3NoYXJlZDxPYmplY3Q+KCksIHAyID0gbWFrZV9zaGFyZWQ8RGVyaXZlZD4oKTsgCglJbnB1dEFycmF5IChwMSk7IAoJSW5wdXRBcnJheSAocDIpOyAKCXJldHVybiAwOwp9