动多态与静多态
副标题#e#
各人都知道面向工具措施设计有三个特点:封装、担任、多态。多态在面向工具措施设计中起着举足轻重的浸染。
上述的多态是如何实现的呢?凡是是有一个基类,它包括了一些特定的接口,而该类的子类重载了这些接口;利用基类的指针可能引用指向子类的工具,那么就可以实现挪用子类对应的函数的成果;此种现象被称为多态。
上述多态有哪些特点呢?
1.它是绑定的。即有一个基类,个中存在一些接口,子类必需重载这些接口,这就是绑定的。
2.它是动态的。这些函数挪用机制是执行期才气举办确定,所以是动态的。
具有上述两种特性的多态我们可以给它个新的名称,动多态。那么是否存在一种多态叫静多态?确实有静多态。
我想各人必定已经猜到了静多态的特点了:
1.它长短绑定的:因为回收模板机制,所以没有所谓的基类,所以就不需要绑定。
2.它是静态的:因为不回收虚函数机制,所以所有挪用在编译期就可确定,所以是静态的。
静多态如何实现呢?
Class Circle
{
Public:
Void Draw() const
{
Cout<<” Circle Draw”<<endl;
}
}
Class Line
{
Public:
Void Draw() const
{
Cout<<” Line Draw”<<endl;
}
}
Template<typename T>
Void DrawGeoObj(T const & obj)
{
Obj.Draw();
}
Int main(int *argc, char *argv[])
{
Circle c1;
Line l1;
DrawGeoObj(c1);// A
DrawGeoObj(l1);// B
}
此时A、B两句即可以认为是静多态。
此时您大概认为这基础不是什么多态,只不外是模板函数而已。那么好吧,我再举一个例子。
我们知道在桥模式(拜见《设计模式》一书)中所说桥模式一般回收如下的方法实现:
#p#副标题#e#
而假如回收模板的方法那就会很简朴:
Template<typename T>
Class Interface
{
Private:
T body;
Public:
…
}
只需要通报差异的参数implementation A可能implementation B就可以了。
我仿佛听到你说“可是…”,是的回收这种方法实现桥模式之后有它的长处也有它的缺点。不外通过这个例子使我们多了一种选择,那就是静多态。
颠末上面的说明和举例,我想各人已经根基大白什么是静多态了。我再一次强调把上面那种雷同我们凡是领略的多态的实现要领称为静多态。
静多态有以下利益:
1.范例安详的。因为会在编译期举办代码的查抄,所以比动多态要安详。
2.效率要高。因为不需要执行期的决策,所以效率较量高。
静多态有以下缺点:
1.不可以或许处理惩罚异类的荟萃。
2.没有动多态机动(在上面桥静多态实现的桥模式中不可以或许动态改变实现)。
我们可以团结动多态和静多态来得到一个很好的效率和机动性。
以上内容根基上来自于一本报告模板的书籍,接待各人指正和品评。