#include <iostream>
#include <string>
using namespace std;
template<class T>
class Base
{
public:
auto VirtualFuncInterface()// How to write in C++11 or older style?
{
return static_cast<T*>(this)->VirtualFuncImpl();
}
};
class Derived : public Base<Derived>
{
public:
bool VirtualFuncImpl()
{
cout << "Derived" << endl;
return true;
}
};
class Derived2 : public Base<Derived2>
{
public:
double VirtualFuncImpl()
{
cout << "Derived2" << endl;
return 94.87;
}
};
template<class T>
void Poly(Base<T>* b)
{
cout<<b->VirtualFuncInterface()<<endl;
}
int main()
{
Base<Derived2>* ptr = new Derived2;
Base<Derived>* ptr2 = new Derived;
Poly(ptr);
Poly(ptr2);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIEJhc2UKewpwdWJsaWM6CglhdXRvIFZpcnR1YWxGdW5jSW50ZXJmYWNlKCkvLyBIb3cgdG8gd3JpdGUgaW4gQysrMTEgb3Igb2xkZXIgc3R5bGU/Cgl7CgkJcmV0dXJuIHN0YXRpY19jYXN0PFQqPih0aGlzKS0+VmlydHVhbEZ1bmNJbXBsKCk7Cgl9Cn07CmNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZTxEZXJpdmVkPgp7CnB1YmxpYzoKCWJvb2wgVmlydHVhbEZ1bmNJbXBsKCkKCXsKCQljb3V0IDw8ICJEZXJpdmVkIiA8PCBlbmRsOwoJCXJldHVybiB0cnVlOwoJfQp9OwpjbGFzcyBEZXJpdmVkMiA6IHB1YmxpYyBCYXNlPERlcml2ZWQyPgp7CnB1YmxpYzoKCWRvdWJsZSBWaXJ0dWFsRnVuY0ltcGwoKQoJewoJCWNvdXQgPDwgIkRlcml2ZWQyIiA8PCBlbmRsOwoJCXJldHVybiA5NC44NzsKCX0KfTsKdGVtcGxhdGU8Y2xhc3MgVD4Kdm9pZCBQb2x5KEJhc2U8VD4qIGIpCnsKCWNvdXQ8PGItPlZpcnR1YWxGdW5jSW50ZXJmYWNlKCk8PGVuZGw7Cn0KaW50IG1haW4oKQp7CglCYXNlPERlcml2ZWQyPiogcHRyID0gbmV3IERlcml2ZWQyOwoJQmFzZTxEZXJpdmVkPiogcHRyMiA9IG5ldyBEZXJpdmVkOwoJUG9seShwdHIpOwoJUG9seShwdHIyKTsKCXJldHVybiAwOwp9