#include <iostream>
#include <vector>
using namespace std;
struct A {
virtual ~A() {}; // to make A and its descendents polymorphic, you need at least one virtual function
};
struct B : A {
void foo () { cout<<"this is a B object: foo!"<<endl; }
};
struct C : A {};
int main() {
vector<A*> va;
va.push_back (new A);
va.push_back (new B);
va.push_back(new C);
for (auto x : va) {
auto maybe = dynamic_cast<B*>(x);
if (maybe) // yes, it's a B*
maybe->foo();
else cout << "still not a B"<<endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEEgewoJdmlydHVhbCB+QSgpIHt9OyAgLy8gdG8gbWFrZSBBIGFuZCBpdHMgZGVzY2VuZGVudHMgcG9seW1vcnBoaWMsIHlvdSBuZWVkIGF0IGxlYXN0IG9uZSB2aXJ0dWFsIGZ1bmN0aW9uCn07CnN0cnVjdCBCIDogQSB7Cgl2b2lkIGZvbyAoKSB7IGNvdXQ8PCJ0aGlzIGlzIGEgQiBvYmplY3Q6IGZvbyEiPDxlbmRsOyB9Cn07CnN0cnVjdCBDIDogQSB7fTsKCmludCBtYWluKCkgewoJdmVjdG9yPEEqPiB2YTsgCgl2YS5wdXNoX2JhY2sgKG5ldyBBKTsKCXZhLnB1c2hfYmFjayAobmV3IEIpOyAKCXZhLnB1c2hfYmFjayhuZXcgQyk7IAoJZm9yIChhdXRvIHggOiB2YSkgewoJCWF1dG8gbWF5YmUgPSBkeW5hbWljX2Nhc3Q8Qio+KHgpOwoJCWlmIChtYXliZSkgLy8geWVzLCBpdCdzIGEgQioKCSAgICAgICBtYXliZS0+Zm9vKCk7IAoJICAgIGVsc2UgY291dCA8PCAic3RpbGwgbm90IGEgQiI8PGVuZGw7IAoJfQoJcmV0dXJuIDA7Cn0=