(a) class Stack { public: virtual void push(int x) = 0; virtual int pop() = 0; }; void foo(Stack& x) { // use push() and pop()... } (b) template <class Stack> void bar(Stack& x) { // use push and pop... }