模板实现的静多态

一、概念引入

动多态:根据继承和虚函数实现的多态,这里不过多介绍

静多态:通过模板技术实现的多态,在编译期决定

特点:具有隐式的公共性,必须支持某些使用公共的语法操作(也就是说,相关的函数必须具有相同的名称),另外具体类之间的定义是相互独立的


二、举例

//  具象的几何类别  Circle 
// -  不衍生自任何类别 
class Circle { 
public: 
void draw() const; 
Coord center_of_gravity() const; 
//... 
}; 
 
//  具象的几何类别  Line 
// -  不衍生自任何类别 
class Line { 
public: 
void draw() const; 
Coord center_of_gravity() const; 
//... 
}; 
//...


现在,这些  classes 的应用程序看起来像这样: 
 
 
//  绘出任何给定的  GeoObj 
template <typename GeoObj> 
void myDraw (GeoObj const& obj) { 
obj.draw(); //  根据对象的类型调用  draw() 
}  
 
//  处理两个  GeoObjs  重心之间的距离 
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(); //  传回坐标绝对值 

 
//  绘出  GeoObjs  同质群集(homogeneous collection) 
template <typename GeoObj> 
void drawElems (std::vector<GeoObj> const& elems) { 
for (unsigned i=0; i<elems.size(); ++i) { 
elems[i].draw(); //  根据元素的类型调用  draw() 


 
int main() { 
Line l; 
Circle c, c1, c2; 
 

// myDraw<Line>(GeoObj&) => Line::draw() 
myDraw(l); 

// myDraw<Circle>(GeoObj&) => Circle::draw() 
myDraw(c); 
 

// distance<Circle,Circle>(GeoObj1&,GeoObj2&) 
distance(c1,c2);  

// distance<Line,Circle>(GeoObj1&,GeoObj2&)  
distance(l,c); 
 
// std::vector<GeoObj*> coll; // ERROR:  不可以是异质群集 
std::vector<Line> coll; // OK:  同质群集没问题 
coll.push_back(l); //  安插一条直线 
drawElems(coll); //  画出所有直线 


distance()不可再以   GeoObj 为具体参数类型,myDraw()的情况也一样。我们改而提供两个 template parameters GeoObj1  和  GeoObj2。透过两个不同的  template parameters,一对「几何型 别组」可被拿来计算两几何对象间的距离: 
 
distance(l,c); //distance<Line,Circle>(GeoObj1&,GeoObj2&) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值