模板多态

来源:互联网 发布:我跟肌肉男的夜晚知乎 编辑:程序博客网 时间:2024/06/04 00:27

函数模板:

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. 动多态: 对于几个相关对象的类型,确定它们之间的一个共同功能集;然后在基类中,把这些共同的功能声明为多个虚函数接口。

                                      image

如上,draw(), center_of_gravity() 都是主要的动态接口

2.静多态: 这种多态并不依赖基类中包含公共行为的因素,相关的函数具有相同的名称。

                                             image

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
0 0
原创粉丝点击