#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class A {
public:
int va1;
int va2;
string va3;
virtual void fa1(int x1, string x2) { }
int fa2 (bool y1, double y2) { cout <<"call A::fa2()"<<endl;}
A() { }
virtual ~A() { }
};
class B : public A {
public:
bool ab1;
double ab2;
long double ab3;
bool fb1(double x1) { }
long double fb2() { cout << "call B::fb2()"<<endl;}
B(int z1) : ab2(z1) { }
virtual ~B() { }
};
class C : public A {
public:
int ac1;
long double fc1() { }
virtual void fa1(int x1, string x2) { }
C() { }
virtual ~C() { }
};
int main() {
vector<shared_ptr<A>> v;
v.push_back(make_shared<A>());
v.push_back(make_shared<B>(2));
v.push_back(make_shared<C>());
for (shared_ptr<A> pa : v) {
pa->fa2(true,0.07);
shared_ptr<B> pb = dynamic_pointer_cast<B>(pa);
if (pb) {
cout << "Object is also a B"<<endl;
pb->fb2();
} else cout << "Object is not a B"<<endl;
cout <<endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQSB7CnB1YmxpYzoKICAgIGludCB2YTE7CiAgICBpbnQgdmEyOwogICAgc3RyaW5nIHZhMzsKCiAgICB2aXJ0dWFsIHZvaWQgZmExKGludCB4MSwgc3RyaW5nIHgyKSB7ICB9CiAgICBpbnQgZmEyIChib29sIHkxLCBkb3VibGUgeTIpIHsgY291dCA8PCJjYWxsIEE6OmZhMigpIjw8ZW5kbDt9CiAgICBBKCkgeyB9CiAgICB2aXJ0dWFsIH5BKCkgeyB9Cn07CmNsYXNzIEIgOiBwdWJsaWMgQSB7CnB1YmxpYzoKICAgIGJvb2wgYWIxOwogICAgZG91YmxlIGFiMjsKICAgIGxvbmcgZG91YmxlIGFiMzsKCiAgICBib29sIGZiMShkb3VibGUgeDEpIHsgfQogICAgbG9uZyBkb3VibGUgZmIyKCkgeyBjb3V0IDw8ICJjYWxsIEI6OmZiMigpIjw8ZW5kbDt9CiAgICBCKGludCB6MSkgOiBhYjIoejEpIHsgfQogICAgdmlydHVhbCB+QigpIHsgfQp9OwpjbGFzcyBDIDogcHVibGljIEEgewpwdWJsaWM6CiAgICBpbnQgYWMxOwoKICAgIGxvbmcgZG91YmxlIGZjMSgpIHsgICB9CiAgICB2aXJ0dWFsIHZvaWQgZmExKGludCB4MSwgc3RyaW5nIHgyKSB7ICB9CiAgICBDKCkgeyB9CiAgICB2aXJ0dWFsIH5DKCkgeyB9Cn07CgppbnQgbWFpbigpIHsKCXZlY3RvcjxzaGFyZWRfcHRyPEE+PiB2OyAgCgkKCXYucHVzaF9iYWNrKG1ha2Vfc2hhcmVkPEE+KCkpOwoJdi5wdXNoX2JhY2sobWFrZV9zaGFyZWQ8Qj4oMikpOwoJdi5wdXNoX2JhY2sobWFrZV9zaGFyZWQ8Qz4oKSk7CgkKCWZvciAoc2hhcmVkX3B0cjxBPiBwYSA6IHYpIHsgCgkJcGEtPmZhMih0cnVlLDAuMDcpOwoJICAgIHNoYXJlZF9wdHI8Qj4gcGIgPSBkeW5hbWljX3BvaW50ZXJfY2FzdDxCPihwYSk7IAoJICAgIGlmIChwYikgewoJICAgIAljb3V0IDw8ICJPYmplY3QgaXMgYWxzbyBhIEIiPDxlbmRsOwoJCSAgICBwYi0+ZmIyKCk7IAoJICAgIH0gZWxzZSBjb3V0IDw8ICJPYmplY3QgaXMgbm90IGEgQiI8PGVuZGw7IAoJICAgIGNvdXQgPDxlbmRsOyAKCX0KCQoJcmV0dXJuIDA7Cn0=