c++ CRTP
template<class Derived> class Basic { public: int interfaceAdd(int a, int b) { return static_cast<Derived*>(this)->implAdd(a, b); } private: virtual int implAdd(int a, int b) = 0; }; class FiniteField : public Basic<FiniteField> { public: FiniteField() {} virtual int implAdd(int a, int b) { return a ^ b; } }; template<class T> int DoAdd(Basic<T>& inf, int a, int b) { return inf.interfaceAdd(a, b); } TEST(RandomGenerator, test) { FiniteField ff; std::cout << ff.interfaceAdd(1, 2) << std::endl; std::cout << DoAdd(ff, 3, 4) << std::endl; }