函数模板:
template <typename T>
inline T const& Max (T const& a, T const& b)
{
return a < b ? b:a;
}
类模板:
template <class T> class Stack { private: vector<T> elems; // elements public: void push(T const&); // push element void pop(); // pop element T top() const; // return top element bool empty() const{ // return true if empty. return elems.empty(); } }; template <class T> void Stack<T>::push (T const& elem) { // append copy of passed element elems.push_back(elem); } template <class T> void Stack<T>::pop () { if (elems.empty()) { throw out_of_range("Stack<>::pop(): empty stack"); } // remove last element elems.pop_back(); }
1. 动多态: 对于几个相关对象的类型,确定它们之间的一个共同功能集;然后在基类中,把这些共同的功能声明为多个虚函数接口。
如上,draw(), center_of_gravity() 都是主要的动态接口
2.静多态: 这种多态并不依赖基类中包含公共行为的因素,相关的函数具有相同的名称。
template<typename GeoObj>
void myDraw(GeoObj const& obj)
{
obj.draw();
}
template<typename GeoObj1, typename GeoObj2>
Coord distance(GeoObj1 const& x1, GeoObj2 const& x2)
{
Coord c=x1.center_of_gravity()-x2.center_of_gravity();
return c.abs();
}
int main()
{
Line l;
Circle c, c1, c2;
myDraw(l);
myDraw(c);
distance(c1,c2);
}
动多态 和 静多态
- 通过继承实现的多态是绑定和动态的; 绑定是指参与多态行为的类型,它们接口是在公共基类的设计中就预先去定的,动态是指接口的绑定是在运行期(动态)完成的。这种情况下,可执行代码通常较小,完全编译;
- 通过模板实现的多态是非绑定的和静态的;接口的绑定在编译器(静态)完成的。 这种方法生成代码效率比较高,具有更好的类型安全性,静多态在编译期会对绑定操作进行检查。
参考:
《C++ Templates》
tutorialspoint.com/cplusplus/cpp_templates.htm