模板多态

函数模板:

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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不负初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值