#include <iostream>
struct B
{
int type;
int val;
B(int v) : type(0), val(v) {}
B(int t, int v) : type(t), val(v) {};
};
struct D1 : public B
{
D1(int v) : B(1, v) {}
void add100() { val += 100; }
};
struct D2 : public B
{
D2(int v) : B(2, v) {}
void mul100() { val *= 100; }
};
void f(B &b)
{
using namespace std;
cout << "pre = " << b.val << endl;
switch (b.type) {
case 1:
static_cast<D1 &>(b).add100(); // downcast
break;
case 2:
static_cast<D2 &>(b).mul100(); // downcast
break;
}
cout << "post = " << b.val << endl;
}
int main(int argc, char **argv) {
D1 d1(11);
f(d1);
D2 d2(22);
f(d2);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEIKewogICAgaW50IHR5cGU7CglpbnQgdmFsOwoJQihpbnQgdikgOiB0eXBlKDApLCB2YWwodikge30KCUIoaW50IHQsIGludCB2KSA6IHR5cGUodCksIHZhbCh2KSB7fTsKfTsKCnN0cnVjdCBEMSA6IHB1YmxpYyBCCnsKCUQxKGludCB2KSA6IEIoMSwgdikge30KCXZvaWQgYWRkMTAwKCkgeyB2YWwgKz0gMTAwOyB9Cn07CgpzdHJ1Y3QgRDIgOiBwdWJsaWMgQgp7CglEMihpbnQgdikgOiBCKDIsIHYpIHt9Cgl2b2lkIG11bDEwMCgpIHsgdmFsICo9IDEwMDsgfQp9OwoKdm9pZCBmKEIgJmIpCnsKCXVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoJY291dCA8PCAicHJlICA9ICIgPDwgYi52YWwgPDwgZW5kbDsKCXN3aXRjaCAoYi50eXBlKSB7CgljYXNlIDE6CgkJc3RhdGljX2Nhc3Q8RDEgJj4oYikuYWRkMTAwKCk7IC8vIGRvd25jYXN0CgkJYnJlYWs7CgljYXNlIDI6CgkJc3RhdGljX2Nhc3Q8RDIgJj4oYikubXVsMTAwKCk7IC8vIGRvd25jYXN0CgkJYnJlYWs7Cgl9Cgljb3V0IDw8ICJwb3N0ID0gIiA8PCBiLnZhbCA8PCBlbmRsOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCUQxIGQxKDExKTsKCWYoZDEpOwoKCUQyIGQyKDIyKTsKCWYoZDIpOwoJcmV0dXJuIDA7Cn0KCg==