#include <iostream>
#include <cstdlib>
using namespace std;
struct Dude {
virtual void howdy() = 0;
};
struct Bob : public Dude {
virtual void howdy() { cout << "Hi, Bob!" << endl; }
};
struct Moe : public Dude {
virtual void howdy() { cout << "Hi, Moe!" << endl; }
};
void say_hi(Dude& dude) {
dude.howdy(); // <<== Here is the tricky line
}
int main(int argc, char* argv[]) {
Bob b;
Moe m;
Dude *d = rand() & 1 ? (Dude*)&b : &m;
say_hi(*d);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgRHVkZSB7CiAgICB2aXJ0dWFsIHZvaWQgaG93ZHkoKSA9IDA7Cn07CnN0cnVjdCBCb2IgOiBwdWJsaWMgRHVkZSB7CiAgICB2aXJ0dWFsIHZvaWQgaG93ZHkoKSB7IGNvdXQgPDwgIkhpLCBCb2IhIiA8PCBlbmRsOyB9Cn07CnN0cnVjdCBNb2UgOiBwdWJsaWMgRHVkZSB7CiAgICB2aXJ0dWFsIHZvaWQgaG93ZHkoKSB7IGNvdXQgPDwgIkhpLCBNb2UhIiA8PCBlbmRsOyB9Cn07CnZvaWQgc2F5X2hpKER1ZGUmIGR1ZGUpIHsKICAgIGR1ZGUuaG93ZHkoKTsgLy8gPDw9PSBIZXJlIGlzIHRoZSB0cmlja3kgbGluZQp9CmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgIEJvYiBiOwogICAgTW9lIG07CiAgICBEdWRlICpkID0gcmFuZCgpICYgMSA/IChEdWRlKikmYiA6ICZtOwogICAgc2F5X2hpKCpkKTsKfQo=