#include <iostream>
#include <memory>
#include <queue>
using namespace std;
class Base {
public:
Base(int arg): val(arg) {};
virtual ~Base() = default;
int val;
};
class Derived1: virtual public Base {
public:
Derived1(int arg): Base(arg) {};
};
class Derived2: virtual public Base {
using Base::Base;
};
void doSomething(std::shared_ptr<Base> ptr) {
cout << "Ptr: " << typeid(ptr).name() << endl;
cout << "Obj: " << typeid(*ptr).name() << endl;
cout << "Val: " << ptr->val << endl;
}
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>(2));
doSomething(std::make_shared<Derived2>(3));
copyPtr(std::make_shared<Derived1>(4), ptr);
doSomething(ptr);
copyPtr(std::make_shared<Derived2>(5), ptr);
doSomething(ptr);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8cXVldWU+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQmFzZSB7CnB1YmxpYzoKCUJhc2UoaW50IGFyZyk6IHZhbChhcmcpIHt9OwoJdmlydHVhbCB+QmFzZSgpID0gZGVmYXVsdDsKICAgIGludCB2YWw7Cn07CgpjbGFzcyBEZXJpdmVkMTogdmlydHVhbCBwdWJsaWMgQmFzZSB7CnB1YmxpYzoKCURlcml2ZWQxKGludCBhcmcpOiBCYXNlKGFyZykge307Cn07CgpjbGFzcyBEZXJpdmVkMjogdmlydHVhbCBwdWJsaWMgQmFzZSB7Cgl1c2luZyBCYXNlOjpCYXNlOwp9OwoKdm9pZCBkb1NvbWV0aGluZyhzdGQ6OnNoYXJlZF9wdHI8QmFzZT4gcHRyKSB7Cgljb3V0IDw8ICJQdHI6ICIgPDwgdHlwZWlkKHB0cikubmFtZSgpIDw8IGVuZGw7Cgljb3V0IDw8ICJPYmo6ICIgPDwgdHlwZWlkKCpwdHIpLm5hbWUoKSA8PCBlbmRsOwogICAgY291dCA8PCAiVmFsOiAiIDw8IHB0ci0+dmFsIDw8IGVuZGw7Cn0KCnZvaWQgY29weVB0cihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QmFzZT4mIGluLCBzdGQ6OnNoYXJlZF9wdHI8QmFzZT4mIG91dCkKewoJc3RkOjpxdWV1ZTxzdGQ6OnNoYXJlZF9wdHI8QmFzZT4+IHE7CgkKCXEucHVzaChpbik7CglvdXQgPSBxLmZyb250KCk7CglxLnBvcCgpOwp9CgppbnQgbWFpbigpIHsKCXN0ZDo6c2hhcmVkX3B0cjxCYXNlPiBwdHI7CgkKICAgIGRvU29tZXRoaW5nKHN0ZDo6bWFrZV9zaGFyZWQ8RGVyaXZlZDE+KDIpKTsKICAgIGRvU29tZXRoaW5nKHN0ZDo6bWFrZV9zaGFyZWQ8RGVyaXZlZDI+KDMpKTsKICAgIAogICAgY29weVB0cihzdGQ6Om1ha2Vfc2hhcmVkPERlcml2ZWQxPig0KSwgcHRyKTsKICAgIGRvU29tZXRoaW5nKHB0cik7CiAgICBjb3B5UHRyKHN0ZDo6bWFrZV9zaGFyZWQ8RGVyaXZlZDI+KDUpLCBwdHIpOwogICAgZG9Tb21ldGhpbmcocHRyKTsKfQo=