#include <iostream>
#define CLASS(name) \
virtual std::string className() { \
return #name; \
}
class A {
public:
CLASS(A)
A(){}
~A(){}
void output() {
std::cout << className() << std::endl;
}
};
class B: public A{
public:
CLASS(B)
B(){}
~B(){}
};
int main() {
B b;
b.output(); // This obviously outputs "A" but I would
// like it to output "B" from the base class
// function
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKI2RlZmluZSBDTEFTUyhuYW1lKSAgICAgICAgICAgICAgXAogICAgdmlydHVhbCBzdGQ6OnN0cmluZyBjbGFzc05hbWUoKSB7ICAgIFwKICAgICAgICByZXR1cm4gI25hbWU7ICAgICAgICAgICAgXCAgICAgCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgCgpjbGFzcyBBIHsKcHVibGljOgogICBDTEFTUyhBKSAKCiAgIEEoKXt9CiAgIH5BKCl7fSAgCgogICB2b2lkIG91dHB1dCgpIHsKICAgICAgIHN0ZDo6Y291dCA8PCBjbGFzc05hbWUoKSA8PCBzdGQ6OmVuZGw7CiAgIH0KfTsKCmNsYXNzIEI6IHB1YmxpYyBBewpwdWJsaWM6CiAgIENMQVNTKEIpCiAgIEIoKXt9CiAgIH5CKCl7fQp9OwoKaW50IG1haW4oKSB7CiAgIEIgYjsKICAgYi5vdXRwdXQoKTsgICAgLy8gVGhpcyBvYnZpb3VzbHkgb3V0cHV0cyAiQSIgYnV0IEkgd291bGQKICAgICAgICAgICAgICAgICAgLy8gbGlrZSBpdCB0byBvdXRwdXQgIkIiIGZyb20gdGhlIGJhc2UgY2xhc3MKICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24KICAgcmV0dXJuIDA7Cn0K