#include <iostream>
template <typename Child>
struct Base
{
void interface()
{
static_cast<Child*>(this)->implementation();
}
};
struct Derived : Base<Derived>
{
void implementation()
{
std::clog << "Derived implementation\n";
}
};
int main()
{
Derived d;
d.interface(); // Prints "Derived implementation"
Base<Derived> & statically_polymorphic = d;
statically_polymorphic.interface(); // Prints "Derived implementation" as well
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIENoaWxkPgpzdHJ1Y3QgQmFzZQp7CiAgICB2b2lkIGludGVyZmFjZSgpCiAgICB7CiAgICAgICAgc3RhdGljX2Nhc3Q8Q2hpbGQqPih0aGlzKS0+aW1wbGVtZW50YXRpb24oKTsKICAgIH0KfTsKCnN0cnVjdCBEZXJpdmVkIDogQmFzZTxEZXJpdmVkPgp7CiAgICB2b2lkIGltcGxlbWVudGF0aW9uKCkKICAgIHsKICAgICAgICBzdGQ6OmNsb2cgPDwgIkRlcml2ZWQgaW1wbGVtZW50YXRpb25cbiI7CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIERlcml2ZWQgZDsKICAgIGQuaW50ZXJmYWNlKCk7ICAvLyBQcmludHMgIkRlcml2ZWQgaW1wbGVtZW50YXRpb24iCgogICAgQmFzZTxEZXJpdmVkPiAmIHN0YXRpY2FsbHlfcG9seW1vcnBoaWMgPSBkOwogICAgc3RhdGljYWxseV9wb2x5bW9ycGhpYy5pbnRlcmZhY2UoKTsgIC8vIFByaW50cyAiRGVyaXZlZCBpbXBsZW1lbnRhdGlvbiIgYXMgd2VsbAp9Cgo=