#include <iostream>
using namespace std;
class A {
public:
A() : val(0) {}
int val;
void run() { cout << val; }
};
class B : public A {
public:
virtual void run() { cout << val + 2; }
};
class C : public B {
};
void Do(A *a) {
B *b;
C *c;
if(b = static_cast<B *>(a))
b->run();
if(c = dynamic_cast<C *>(b))
c->run();
a->run();
}
int main() {
A *a = new C();;
Do(a);
return 0;
}
ICAjaW5jbHVkZSA8aW9zdHJlYW0+CiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgCiAgICBjbGFzcyBBIHsgCiAgICBwdWJsaWM6CiAgICAgICAgQSgpIDogdmFsKDApIHt9CiAgICAgICAgaW50IHZhbDsKICAgICAgICB2b2lkIHJ1bigpIHsgY291dCA8PCB2YWw7IH0gCiAgICB9OwogICAgCiAgICBjbGFzcyBCIDogcHVibGljIEEgewogICAgcHVibGljOgogICAgICAgIHZpcnR1YWwgdm9pZCBydW4oKSB7IGNvdXQgPDwgdmFsICsgMjsgfSAKICAgIH07CiAgICAKICAgIGNsYXNzIEMgOiBwdWJsaWMgQiB7CiAgICB9OwogICAgCiAgICB2b2lkIERvKEEgKmEpIHsKICAgICAgICBCICpiOwogICAgICAgIEMgKmM7CiAgICAgICAgaWYoYiA9IHN0YXRpY19jYXN0PEIgKj4oYSkpCiAgICAgICAgICAgIGItPnJ1bigpOwogICAgICAgIGlmKGMgPSBkeW5hbWljX2Nhc3Q8QyAqPihiKSkKICAgICAgICAgICAgYy0+cnVuKCk7CiAgICAgICAgYS0+cnVuKCk7CiAgICB9CiAgICAKICAgIGludCBtYWluKCkgewogICAgICAgIEEgKmEgPSBuZXcgQygpOzsKICAgICAgICBEbyhhKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0=