Mega Code Archive

 
Categories / C++ Tutorial / Template
 

Virtual template

/* The following code example is taken from the book  * "C++ Templates - The Complete Guide"  * by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002  *  * (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002.  * Permission to copy, use, modify, sell and distribute this software  * is granted provided this copyright notice appears in all copies.  * This software is provided "as is" without express or implied  * warranty, and with no claim as to its suitability for any purpose.  */ #include <iostream> class NotVirtual { }; class Virtual {   public:     virtual void foo() {     } }; template <typename VBase> 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 <typename V> class Derived : public Base<V> {   public:     void foo() {        std::cout << "Derived::foo()" << '\n';     } }; int main() {     Base<NotVirtual>* p1 = new Derived<NotVirtual>;     p1->foo();  // calls Base::foo()     Base<Virtual>* p2 = new Derived<Virtual>;     p2->foo();  // calls Derived::foo() } Base::foo() Derived::foo()