目录
第14章 模板的多态威力
多态是一种能够令单一的泛型标记关联不同特定行为的能力。 对面向对象的程序设计范例而言, 多态可以说是一块基石。 在C++中, 这块基石主要是通过继承和虚函数来实现的。 由于这两个机制(继承和虚函数) 都是(至少一部分) 在运行期进行处理的, 因此我们把这种多态称为动多态(dynamic polymorphism) ; 我们平常所谈论的C++多态指的就是这种动多态。 然而, 模板也允许我们使用单一的泛型标记, 来关联不同的特定行为; 但这种(借助于模板的) 关联是在编译期进行处理的, 因此我们把这种(借助于模板的) 多态称为静多态(static polymorphism) , 从而和上面的动多态区分开来。 在这一章里, 我们将重温这两种形式的多态, 然后讨论: 在何种情况下, 应该使用哪一种多态。
14.1 动多态
、
可以如下组织具体的代码:
/ 画任意一个GeoObj
void myDraw(GeoObj const& obj)
{
obj.draw(); // 根据对象的类型来调用对应的draw()
}
//计算两个 GeoObj对象重心之间的距离
Coord distance(GeoObj const& x1, GeoObj const& x2)
{
Coord c = x1.center_of_gravity() - x2.center_of_gravity();
return c.abs(); // 返回坐标的绝对值
}
// 画出属于异类集合的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(l); // myDraw(GeoObj&) => Line::draw()
myDraw(c); // myDraw(GeoObj&) => Circle::draw()
distance(c1, c2); // distance(GeoObj&,GeoObj&)