#include <iostream>
#include <vector>
#include <memory>
class Base {
public:
virtual void go() {
std::cout << "I am the base class" << std::endl;
}
};
typedef std::shared_ptr<Base> base_ptr;
class DerA : public Base {
void go() {
std::cout << "I am the first derivative" << std::endl;
}
};
class DerB : public Base {
void go() {
std::cout << "I am the second derivative" << std::endl;
}
};
class UnrelatedClass {
public:
std::vector<base_ptr> vec;
void add_to_vec(const base_ptr& thing) {
vec.push_back(thing);
}
};
int main() {
UnrelatedClass uc;
uc.add_to_vec(std::make_shared<Base>());
uc.add_to_vec(std::make_shared<DerA>());
uc.add_to_vec(std::make_shared<DerB>());
for (auto thing : uc.vec) {
thing->go();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgQmFzZSB7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBnbygpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkkgYW0gdGhlIGJhc2UgY2xhc3MiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfTsKCnR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPEJhc2U+IGJhc2VfcHRyOwoKY2xhc3MgRGVyQSA6IHB1YmxpYyBCYXNlIHsKICAgIHZvaWQgZ28oKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJJIGFtIHRoZSBmaXJzdCBkZXJpdmF0aXZlIiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CgpjbGFzcyBEZXJCIDogcHVibGljIEJhc2UgewogICAgdm9pZCBnbygpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkkgYW0gdGhlIHNlY29uZCBkZXJpdmF0aXZlIiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CgpjbGFzcyBVbnJlbGF0ZWRDbGFzcyB7CnB1YmxpYzoKICAgIHN0ZDo6dmVjdG9yPGJhc2VfcHRyPiB2ZWM7CiAgICB2b2lkIGFkZF90b192ZWMoY29uc3QgYmFzZV9wdHImIHRoaW5nKSB7CiAgICAgICAgdmVjLnB1c2hfYmFjayh0aGluZyk7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIFVucmVsYXRlZENsYXNzIHVjOwogICAgdWMuYWRkX3RvX3ZlYyhzdGQ6Om1ha2Vfc2hhcmVkPEJhc2U+KCkpOwogICAgdWMuYWRkX3RvX3ZlYyhzdGQ6Om1ha2Vfc2hhcmVkPERlckE+KCkpOwogICAgdWMuYWRkX3RvX3ZlYyhzdGQ6Om1ha2Vfc2hhcmVkPERlckI+KCkpOwoKICAgIGZvciAoYXV0byB0aGluZyA6IHVjLnZlYykgewogICAgICAgIHRoaW5nLT5nbygpOwogICAgfQoKICAgIHJldHVybiAwOwp9