#include <iostream>
#include <memory>
using namespace std;
class Component {
public:
void show() { cout << "It's me, component "<<this<<endl; }
virtual ~Component() {}
};
class MeshComponent:public Component {
public:
void test() { cout << "It's me, mesh component "<<this<<endl; }
};
const shared_ptr<Component> init() {
return make_shared<MeshComponent>();
}
int main() {
auto p = init();
p->show();
auto q = dynamic_pointer_cast<MeshComponent>(init());
if (q) {
q->show();
q->test();
}
else cout << "Oh oh, something wrong happened"<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQ29tcG9uZW50IHsKcHVibGljOiAKCXZvaWQgc2hvdygpIHsgY291dCA8PCAiSXQncyBtZSwgY29tcG9uZW50ICI8PHRoaXM8PGVuZGw7IH0KCXZpcnR1YWwgfkNvbXBvbmVudCgpIHt9Cn07CgpjbGFzcyBNZXNoQ29tcG9uZW50OnB1YmxpYyBDb21wb25lbnQgewpwdWJsaWM6Cgl2b2lkIHRlc3QoKSB7IGNvdXQgPDwgIkl0J3MgbWUsIG1lc2ggY29tcG9uZW50ICI8PHRoaXM8PGVuZGw7IH0KfTsKCmNvbnN0IHNoYXJlZF9wdHI8Q29tcG9uZW50PiBpbml0KCkgewoJcmV0dXJuIG1ha2Vfc2hhcmVkPE1lc2hDb21wb25lbnQ+KCk7IAp9CgppbnQgbWFpbigpIHsKCWF1dG8gcCA9IGluaXQoKTsgCgkKCXAtPnNob3coKTsgCglhdXRvIHEgPSBkeW5hbWljX3BvaW50ZXJfY2FzdDxNZXNoQ29tcG9uZW50Pihpbml0KCkpOyAKICAgIGlmIChxKSB7CiAgICAJcS0+c2hvdygpOyAKCQlxLT50ZXN0KCk7IAogICAgfQogICAgZWxzZSBjb3V0IDw8ICJPaCBvaCwgc29tZXRoaW5nIHdyb25nIGhhcHBlbmVkIjw8ZW5kbDsgCgkKCXJldHVybiAwOwp9