[C++ Template]模板与设计--模板的多态威力

目录

第14章 模板的多态威力

14.1 动多态

14.2 静多态

14.3 动多态和静多态

14.3.1 术语

14.3.2 优点和缺点


第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&)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值