【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
- 【c++ templates读书笔记】【6】模板的多态
- C++ Templates:模板的多态威力
- C++ Templates读书笔记1__函数模板
- 【c++ templates读书笔记】【1】函数模板
- 【c++ templates读书笔记】【2】类模板
- 【c++ templates读书笔记】【5】模板实战
- 【c++ templates读书笔记】【7】模板元编程
- 《C++Templates》第二章-初探函数模板
- 模板(Templates)
- Templates 模板:
- Templates 模板:
- 【c++ templates读书笔记】【3】非类型模板参数
- 《Effective C++》读书笔记之item44:将与参数无关的代码抽离templates
- 《C++ Templates》读书笔记的一点补充
- flask入门的教程-模板Templates
- 善用Eclipse的代码模板(Templates)功能
- Java 编译器中的code templates的模板
- C++ Templates笔记 6 缺省模板实参
- Python 实例变量、类变量、静态变量 (十九)
- Android- Unicode编码 和 汉字转换( java实现 , javascript实现)
- 图片倍数关系
- 【C#高效编程50例】条目2:用运行时常量(readonly)而不是编译期常量(const)
- STL之list容器详解
- 【c++ templates读书笔记】【6】模板的多态
- Java____Timer实现定时功能及其源码研究
- jquery倒计时功能
- 利用Theano理解深度学习——Logistic Regression
- 算法时间复杂度T(n)大小顺序
- Java语言简介
- SQL Server基础--SQL语句
- hdu1272 小希的迷宫 并查集
- Android 开发第五弹:简易时钟(闹钟)