#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() {
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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKc3RydWN0IEEgewogICAgQSgpIHsgdGVzdCgpOyB9CiAgICB2b2lkIHRlc3QoKSB7IGYoKTsgfQogICAgdmlydHVhbCB2b2lkIGYoKSA9IDA7Cn07Cgp2b2lkIEE6OmYoKSB7CiAgICBzdGQ6OmNvdXQgPDwgIkE6OmYoKSIgPDwgc3RkOjplbmRsOwp9CgpzdHJ1Y3QgQiA6IHB1YmxpYyBBewogICAgdmlydHVhbCB2b2lkIGYoKSB7CiAgICAgICAgQTo6ZigpOyAvLyA8LS0tLS0gY2FsbCBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgICAgc3RkOjpjb3V0IDw8ICJCOjpmKCkiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfTsKCmV4dGVybiAiQyIgdm9pZCBfX2N4YV9wdXJlX3ZpcnR1YWwoKSB7CiAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIk9oIHNoaXQuIEkganVzdCBjYWxsZWQgYSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gOygiKTsKfQoKaW50IG1haW4oKSB7CiAgICB0cnkgewogICAgICAgIEEgKmEgPSBuZXcgQigpOwogICAgICAgIGEtPmYoKTsKICAgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uICZlKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJFeGNlcHRpb24gY2F1Z2h0OiAiIDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIHJldHVybiAwOwp9