#include <iostream>
#include <stdexcept>
struct A {
A() { test(); }
void test() { f(); }
virtual void f() = 0;
};
// void A::f() {
// std::cout << "A::f()" << std::endl;
//}
struct B : public A{
virtual void f() {
std::cout << "B::f()" << std::endl;
}
};
extern "C" void __cxa_pure_virtual() {
throw std::runtime_error("Oh shit. I just called a pure virtual function ;(");
}
int main() {
try {
A *a = new B();
a->f();
} catch (std::exception &e) {
std::cout << "Exception caught: " << e.what() << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKc3RydWN0IEEgewogICAgQSgpIHsgdGVzdCgpOyB9CiAgICB2b2lkIHRlc3QoKSB7IGYoKTsgfQogICAgdmlydHVhbCB2b2lkIGYoKSA9IDA7Cn07CgovLyB2b2lkIEE6OmYoKSB7Ci8vICAgIHN0ZDo6Y291dCA8PCAiQTo6ZigpIiA8PCBzdGQ6OmVuZGw7Ci8vfQoKc3RydWN0IEIgOiBwdWJsaWMgQXsKICAgIHZpcnR1YWwgdm9pZCBmKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAiQjo6ZigpIiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CgpleHRlcm4gIkMiIHZvaWQgX19jeGFfcHVyZV92aXJ0dWFsKCkgewogICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJPaCBzaGl0LiBJIGp1c3QgY2FsbGVkIGEgcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIDsoIik7Cn0KCmludCBtYWluKCkgewogICAgdHJ5IHsKICAgICAgICBBICphID0gbmV3IEIoKTsKICAgICAgICBhLT5mKCk7CiAgICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiAmZSkgewogICAgICAgIHN0ZDo6Y291dCA8PCAiRXhjZXB0aW9uIGNhdWdodDogIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==