【c++ templates读书笔记】【6】模板的多态

来源:互联网 发布:nginx 函数 编辑:程序博客网 时间:2024/05/16 10:58

C++中的多态分为动多态和静多态。

动多态是通过继承和虚函数来实现的,这两个机制都是在运行期进行处理的。平常所谈论的C++多态指的就是这种动多态。

模板也允许使用单一的泛型标记来关联不同的特定行为,这种借助于模板的关联是在编译器进行处理的,因此把这种多态称为静多态。

一、动多态

动多态的设计思想主要在于:对于几个相关对象的类型,确定它们之间的一个共同功能集,然后在基类中,把这些共同的功能声明为多个虚函数接口。

动多态例子:

#include <iostream>using namespace std;class GeoObj{public:virtual void draw() const = 0;};class Circle : public GeoObj{public:void draw() const{cout << "circle is drawing!" << endl;}};class Line : public GeoObj{public:void draw() const{cout << "line is drawing!" << endl;}};void myDraw(GeoObj const& obj){obj.draw();}int main(){Line l;Circle c;myDraw(l);myDraw(c);system("pause");return 0;}

二、静多态

静多态例子:

#include <iostream>using namespace std;class GeoObj{public:virtual void draw() const = 0;};class Circle : public GeoObj{public:void draw() const{cout << "circle is drawing!" << endl;}};class Line : public GeoObj{public:void draw() const{cout << "line is drawing!" << endl;}};template<typename T>void myDraw(T const& obj){obj.draw();}int main(){Line l;Circle c;myDraw(l);myDraw(c);system("pause");return 0;}

三、动多态和静多态比较

动多态和静多态:

通过继承实现的多态是绑定的和动态的;通过模板实现的多态是非绑定的和静态的。

动多态优点:

a、能够优雅地处理异类集合。

b、可执行代码的大小通常比较小(因为只需要一个多态函数,但对于静多态而言,为了处理不同的类型,必须生成多个不同的模板实例)。

c、可以对代码进行完全编译;因此并不需要发布实现源码(但是,分发模板库通常都需要同时分发模板实现的源代码)。

静多态优点:

a、可以很容易地实现内建类型的集合。

b、所生成的代码效率通常比较高(因为并不存在通过指针的间接调用,而且,可以进行演绎的非虚拟函数具有更多的内联机会)。

c、对于只提供部分接口的具体类型,如果在应用程序中只是使用到这一部分接口,那么也可以使用该具体类型,而不必在乎该类型是否提供其他部分的接口。



0 0
原创粉丝点击