#include <iostream>
#include <list>
#include <memory>
using namespace std;
struct A {
virtual void showb() {cout<<"showa"<<endl;} // if no virtual, dynamic_cast will not compile
};
struct B : A {
void showb() {cout<<"showb"<<endl;}
};
int main() {
list <shared_ptr<A>> container;
shared_ptr<B> b = shared_ptr<B>(new B);
container.push_back(b);
auto it = container.begin();
shared_ptr<B> aB = static_pointer_cast<B>(*it);
aB->showb();
container.push_back(make_shared<A>());
for (auto i = container.begin(); i!=container.end(); i++) {
shared_ptr<B> spb = dynamic_pointer_cast<B>(*i);
if (spb)
spb->showb(); // at least one virtual function
else cout << "the pointer was not to a B";
}
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPG1lbW9yeT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBBIHsKCXZpcnR1YWwgdm9pZCBzaG93YigpIHtjb3V0PDwic2hvd2EiPDxlbmRsO30gLy8gaWYgbm8gdmlydHVhbCwgZHluYW1pY19jYXN0IHdpbGwgbm90IGNvbXBpbGUKfTsKc3RydWN0IEIgOiBBIHsKCXZvaWQgc2hvd2IoKSB7Y291dDw8InNob3diIjw8ZW5kbDt9Cn07CgppbnQgbWFpbigpIHsKCQoJbGlzdCA8c2hhcmVkX3B0cjxBPj4gY29udGFpbmVyOyAKCXNoYXJlZF9wdHI8Qj4gYiA9IHNoYXJlZF9wdHI8Qj4obmV3IEIpOwoJY29udGFpbmVyLnB1c2hfYmFjayhiKTsKCQoJYXV0byBpdCA9IGNvbnRhaW5lci5iZWdpbigpOwogICAJc2hhcmVkX3B0cjxCPiBhQiA9IHN0YXRpY19wb2ludGVyX2Nhc3Q8Qj4oKml0KTsKCWFCLT5zaG93YigpOyAKCgljb250YWluZXIucHVzaF9iYWNrKG1ha2Vfc2hhcmVkPEE+KCkpOwoJZm9yIChhdXRvIGkgPSBjb250YWluZXIuYmVnaW4oKTsgaSE9Y29udGFpbmVyLmVuZCgpOyBpKyspIHsKCQlzaGFyZWRfcHRyPEI+IHNwYiA9IGR5bmFtaWNfcG9pbnRlcl9jYXN0PEI+KCppKTsgCgkJaWYgKHNwYikKCQkJc3BiLT5zaG93YigpOyAgLy8gYXQgbGVhc3Qgb25lIHZpcnR1YWwgZnVuY3Rpb24gCgkJZWxzZSBjb3V0IDw8ICJ0aGUgcG9pbnRlciB3YXMgbm90IHRvIGEgQiI7IAoJfQoJCQoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJcmV0dXJuIDA7Cn0=