====== C - C++ Templates - Virtual Template ====== #include class NotVirtual { }; class Virtual { public: virtual void foo() { } }; template class Base : private VBase { public: // The virtuality of foo() depends on its declaration // (if any) in the base class VBase void foo() { std::cout << "Base::foo()" << '\n'; } }; template class Derived : public Base { public: void foo() { std::cout << "Derived::foo()" << '\n'; } }; int main() { Base* p1 = new Derived; p1->foo(); // calls Base::foo() Base* p2 = new Derived; p2->foo(); // calls Derived::foo() }