#include <iostream>
using namespace std;
struct A
{
virtual void f() {std::cout << "A\n";}
};
struct B : public A
{
virtual void f() {std::cout << "B\n";}
};
int main()
{
A* a = new B;
B* b = dynamic_cast<B*>(a);
b->f();
B& br = dynamic_cast<B&>(*a);
br.f();
try
{
A* a2 = new A;
B& fail = dynamic_cast<B&>(*a2);
}
catch(std::exception& e)
{
cout << e.what() << "\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEEKewogICB2aXJ0dWFsIHZvaWQgZigpIHtzdGQ6OmNvdXQgPDwgIkFcbiI7fQp9OwpzdHJ1Y3QgQiA6IHB1YmxpYyBBCnsKICAgdmlydHVhbCB2b2lkIGYoKSB7c3RkOjpjb3V0IDw8ICJCXG4iO30KfTsKCmludCBtYWluKCkKewogICAgQSogYSA9IG5ldyBCOwogICAgCiAgICBCKiBiID0gZHluYW1pY19jYXN0PEIqPihhKTsKICAgIAogICAgYi0+ZigpOwogICAgCiAgICBCJiBiciA9IGR5bmFtaWNfY2FzdDxCJj4oKmEpOwogICAgCiAgICBici5mKCk7CiAgICAKICAgIHRyeQogICAgewogICAgICAgIEEqIGEyID0gbmV3IEE7CiAgICAgICAgQiYgZmFpbCA9IGR5bmFtaWNfY2FzdDxCJj4oKmEyKTsKICAgIH0KICAgIAogICAgY2F0Y2goc3RkOjpleGNlcHRpb24mIGUpCiAgICB7CiAgICAgICAgY291dCA8PCBlLndoYXQoKSA8PCAiXG4iOwogICAgfQogICAgCiAgICByZXR1cm4gMDsKfQoK