#include <iostream>
#include <memory>
#include <queue>
using namespace std;
class Base {
public:
Base() = default;
virtual ~Base() = default;
virtual void run() = 0;
};
class Derived1: public Base {
public:
Derived1() = default;
virtual ~Derived1() = default;
void run() { cout << "Derived1" << endl; }
};
class Derived2: public Base {
public:
Derived2() = default;
virtual ~Derived2() = default;
void run() { cout << "Derived2" << endl; }
};
void doSomething(std::shared_ptr<Base> ptr) {
cout << "Ptr: " << typeid(ptr).name() << endl;
cout << "Obj: " << typeid(*ptr).name() << endl;
ptr->run();
}
void copyPtr(const std::shared_ptr<Base>& in, std::shared_ptr<Base>& out)
{
std::queue<std::shared_ptr<Base>> q;
q.push(in);
out = q.front();
q.pop();
}
int main() {
std::shared_ptr<Base> ptr;
doSomething(std::make_shared<Derived1>());
doSomething(std::make_shared<Derived2>());
copyPtr(std::make_shared<Derived1>(), ptr);
doSomething(ptr);
copyPtr(std::make_shared<Derived2>(), ptr);
doSomething(ptr);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8cXVldWU+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQmFzZSB7CiAgICBwdWJsaWM6CiAgICAgICAgQmFzZSgpID0gZGVmYXVsdDsKICAgICAgICB2aXJ0dWFsIH5CYXNlKCkgPSBkZWZhdWx0OwogICAgICAgIHZpcnR1YWwgdm9pZCBydW4oKSA9IDA7Cn07CgpjbGFzcyBEZXJpdmVkMTogcHVibGljIEJhc2UgewogICAgcHVibGljOgogICAgICAgIERlcml2ZWQxKCkgPSBkZWZhdWx0OwogICAgICAgIHZpcnR1YWwgfkRlcml2ZWQxKCkgPSBkZWZhdWx0OwogICAgICAgIHZvaWQgcnVuKCkgeyBjb3V0IDw8ICJEZXJpdmVkMSIgPDwgZW5kbDsgfQp9OwoKY2xhc3MgRGVyaXZlZDI6IHB1YmxpYyBCYXNlIHsKICAgIHB1YmxpYzoKICAgICAgICBEZXJpdmVkMigpID0gZGVmYXVsdDsKICAgICAgICB2aXJ0dWFsIH5EZXJpdmVkMigpID0gZGVmYXVsdDsKICAgICAgICB2b2lkIHJ1bigpIHsgY291dCA8PCAiRGVyaXZlZDIiIDw8IGVuZGw7IH0KfTsKCnZvaWQgZG9Tb21ldGhpbmcoc3RkOjpzaGFyZWRfcHRyPEJhc2U+IHB0cikgewoJY291dCA8PCAiUHRyOiAiIDw8IHR5cGVpZChwdHIpLm5hbWUoKSA8PCBlbmRsOwoJY291dCA8PCAiT2JqOiAiIDw8IHR5cGVpZCgqcHRyKS5uYW1lKCkgPDwgZW5kbDsKICAgIHB0ci0+cnVuKCk7Cn0KCnZvaWQgY29weVB0cihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QmFzZT4mIGluLCBzdGQ6OnNoYXJlZF9wdHI8QmFzZT4mIG91dCkKewoJc3RkOjpxdWV1ZTxzdGQ6OnNoYXJlZF9wdHI8QmFzZT4+IHE7CgkKCXEucHVzaChpbik7CglvdXQgPSBxLmZyb250KCk7CglxLnBvcCgpOwp9CgppbnQgbWFpbigpIHsKCXN0ZDo6c2hhcmVkX3B0cjxCYXNlPiBwdHI7CgkKICAgIGRvU29tZXRoaW5nKHN0ZDo6bWFrZV9zaGFyZWQ8RGVyaXZlZDE+KCkpOwogICAgZG9Tb21ldGhpbmcoc3RkOjptYWtlX3NoYXJlZDxEZXJpdmVkMj4oKSk7CiAgICAKICAgIGNvcHlQdHIoc3RkOjptYWtlX3NoYXJlZDxEZXJpdmVkMT4oKSwgcHRyKTsKICAgIGRvU29tZXRoaW5nKHB0cik7CiAgICBjb3B5UHRyKHN0ZDo6bWFrZV9zaGFyZWQ8RGVyaXZlZDI+KCksIHB0cik7CiAgICBkb1NvbWV0aGluZyhwdHIpOwp9Cg==