#include <iostream>
#include <stdexcept>
struct A {
A() { f(); }
virtual void f() = 0;
};
void A::f() {
std::cout << "A::f()" << std::endl;
}
struct B : public A{
virtual void f() {
A::f(); // <----- call default implementation
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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKc3RydWN0IEEgewogICAgQSgpIHsgZigpOyB9CiAgICB2aXJ0dWFsIHZvaWQgZigpID0gMDsKfTsKCnZvaWQgQTo6ZigpIHsKICAgIHN0ZDo6Y291dCA8PCAiQTo6ZigpIiA8PCBzdGQ6OmVuZGw7Cn0KCnN0cnVjdCBCIDogcHVibGljIEF7CiAgICB2aXJ0dWFsIHZvaWQgZigpIHsKICAgICAgICBBOjpmKCk7IC8vIDwtLS0tLSBjYWxsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICBzdGQ6OmNvdXQgPDwgIkI6OmYoKSIgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKZXh0ZXJuICJDIiB2b2lkIF9fY3hhX3B1cmVfdmlydHVhbCgpIHsKICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiT2ggc2hpdC4gSSBqdXN0IGNhbGxlZCBhIHB1cmUgdmlydHVhbCBmdW5jdGlvbiA7KCIpOwp9CgppbnQgbWFpbigpIHsKICAgIHRyeSB7CiAgICAgICAgQSAqYSA9IG5ldyBCKCk7CiAgICAgICAgYS0+ZigpOwogICAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24gJmUpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkV4Y2VwdGlvbiBjYXVnaHQ6ICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwogICAgfQogICAgcmV0dXJuIDA7Cn0=