#include namespace clanguml { namespace t20019 { // From https://en.cppreference.com/w/cpp/language/crtp template struct Base { void name() { (static_cast(this))->impl(); } }; struct D1 : public Base { void impl() { std::puts("D1::impl()"); } }; struct D2 : public Base { void impl() { std::puts("D2::impl()"); } }; void tmain() { Base b1; b1.name(); Base b2; b2.name(); D1 d1; d1.name(); D2 d2; d2.name(); } } }