#include <iostream>
#include <string>
template <typename C>
class Super
{
public:
std::string GetFunnyName() const
{
C *thiz = static_cast<C *>(this);
return thiz->GetFunnyName();
}
};
class A : public Super<A>
{
public:
std::string GetFunnyName() const
{
return "A";
}
};
class B : public Super<B>
{
public:
std::string GetFunnyName() const
{
return "B";
}
};
template <typename TSuper>
void OutputFunny(const TSuper &obj)
{
std::cout << obj.GetFunnyName() << "\n";
}
int main()
{
A a;
B b;
OutputFunny(a);
OutputFunny(b);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGUgPHR5cGVuYW1lIEM+CmNsYXNzIFN1cGVyCnsKcHVibGljOgogICAgc3RkOjpzdHJpbmcgR2V0RnVubnlOYW1lKCkgY29uc3QKICAgIHsKICAgICAgICBDICp0aGl6ID0gc3RhdGljX2Nhc3Q8QyAqPih0aGlzKTsKICAgICAgICByZXR1cm4gdGhpei0+R2V0RnVubnlOYW1lKCk7CiAgICB9Cn07CmNsYXNzIEEgOiBwdWJsaWMgU3VwZXI8QT4KewpwdWJsaWM6CiAgICBzdGQ6OnN0cmluZyBHZXRGdW5ueU5hbWUoKSBjb25zdAogICAgewogICAgICAgIHJldHVybiAiQSI7CiAgICB9Cn07CmNsYXNzIEIgOiBwdWJsaWMgU3VwZXI8Qj4KewpwdWJsaWM6CiAgICBzdGQ6OnN0cmluZyBHZXRGdW5ueU5hbWUoKSBjb25zdAogICAgewogICAgICAgIHJldHVybiAiQiI7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVFN1cGVyPgp2b2lkIE91dHB1dEZ1bm55KGNvbnN0IFRTdXBlciAmb2JqKQp7CiAgICBzdGQ6OmNvdXQgPDwgb2JqLkdldEZ1bm55TmFtZSgpIDw8ICJcbiI7Cn0KCmludCBtYWluKCkKewogICAgQSBhOwogICAgQiBiOwoKICAgIE91dHB1dEZ1bm55KGEpOwogICAgT3V0cHV0RnVubnkoYik7Cn0=