一、概念引入
动多态:根据继承和虚函数实现的多态,这里不过多介绍
静多态:通过模板技术实现的多态,在编译期决定
特点:具有隐式的公共性,必须支持某些使用公共的语法操作(也就是说,相关的函数必须具有相同的名称),另外具体类之间的定义是相互独立的
二、举例
// 具象的几何类别 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&)