#include <iostream>
template<class T>
class CRTP
{
public:
void Override() {}
void Call()
{
T* p = (T*)this;
p->Override();
}
};
class Super1 : public CRTP<Super1>
{
public:
void Override()
{
std::cout << "Super1" << std::endl;
}
};
class Super2 : public CRTP<Super2>
{
public:
void Override()
{
std::cout << "Super2" << std::endl;
}
};
int main()
{
Super1 s1;
s1.Call();
Super2 s2;
s2.Call();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgQ1JUUAp7CnB1YmxpYzoKCXZvaWQgT3ZlcnJpZGUoKSB7fQoJCgl2b2lkIENhbGwoKQoJewoJCVQqIHAgPSAoVCopdGhpczsKCQlwLT5PdmVycmlkZSgpOwoJfQp9OwoKCmNsYXNzIFN1cGVyMSA6IHB1YmxpYyBDUlRQPFN1cGVyMT4KewpwdWJsaWM6Cgl2b2lkIE92ZXJyaWRlKCkKCXsKCQlzdGQ6OmNvdXQgPDwgIlN1cGVyMSIgPDwgc3RkOjplbmRsOwoJfQp9OwoKY2xhc3MgU3VwZXIyIDogcHVibGljIENSVFA8U3VwZXIyPgp7CnB1YmxpYzoKCXZvaWQgT3ZlcnJpZGUoKQoJewoJCXN0ZDo6Y291dCA8PCAiU3VwZXIyIiA8PCBzdGQ6OmVuZGw7Cgl9Cn07CgppbnQgbWFpbigpCnsKCVN1cGVyMSBzMTsKCXMxLkNhbGwoKTsKCQoJU3VwZXIyIHMyOwoJczIuQ2FsbCgpOwp9Cg==