c++ template(8)模版多态
一.传统多态->动多态
代码示例:
// common abstract base class GeoObj for geometric objects class GeoObj { public: // draw geometric object: virtual void draw() const = 0; // return center of gravity of geometric object: virtual Coord center_of_gravity() const = 0; … }; // concrete geometric object class Circle // - derived from GeoObj class Circle : public GeoObj { public: virtual void draw() const; virtual Coord center_of_gravity() const; … }; // concrete geometric object class Line // - derived from GeoObj class Line : public GeoObj { public: virtual void draw() const; virtual Coord center_of_gravity() const; … };
调用示例:
// draw any GeoObj void myDraw (GeoObj const& obj) { obj.draw(); // call draw() according to type of object } // process distance of center of gravity between two GeoObjs Coord distance (GeoObj const& x1, GeoObj const& x2) { Coord c = x1.center_of_gravity() - x2.center_of_gravity(); return c.abs(); // return coordinates as absolute values } // draw inhomogeneous collection of GeoObjs void drawElems (std::vector<GeoObj*> const& elems) { for (unsigned i=0; i<elems.size(); ++i) { elems[i]->draw(); // call draw() according to type of element } } 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&) distance(l,c); // distance(GeoObj&,GeoObj&) std::vector<GeoObj*> coll; // inhomogeneous collection coll.push_back(&l); // insert line coll.push_back(&c); // insert circle drawElems(coll); // draw different kinds of GeoObjs }
二.静多态=>模版
不再需要继承
// draw any GeoObj template <typename GeoObj> void myDraw (GeoObj const& obj) { obj.draw(); // call draw() according to type of object } // process distance of center of gravity between two GeoObjs template <typename GeoObj1, typename GeoObj2> Coord distance (GeoObj1 const& x1, GeoObj2 const& x2) { Coord c = x1.center_of_gravity() - x2.center_of_gravity(); return c.abs(); // return coordinates as absolute values } // draw homogeneous collection of GeoObjs template <typename GeoObj> void drawElems (std::vector<GeoObj> const& elems) { for (unsigned i=0; i<elems.size(); ++i) { elems[i].draw(); // call draw() according to type of element } } int main() { Line l; Circle c, c1, c2; myDraw(l); // myDraw<Line>(GeoObj&) => Line::draw() myDraw(c); // myDraw<Circle>(GeoObj&) => Circle::draw() distance(c1,c2); // distance<Circle,Circle>(GeoObj1&,GeoObj2&) distance(l,c); // distance<Line,Circle>(GeoObj1&,GeoObj2&) // std::vector<GeoObj*> coll; // ERROR: no inhomogeneous // collection possible std::vector<Line> coll; // OK: homogeneous collection possible coll.push_back(l); // insert line drawElems(coll); // draw all lines }
三.比较
动多态:1.需要一个公共基类,2.运行时动态绑定3.生成代码比较小 4.不需要发布源代码
静多态:1.不需要继承关系,2.编译时绑定 3.体积大,执行速度效率高
自有优缺点
c++ template(8)模版多态相关推荐
- vue template制作模版
来源于技术胖的视屏讲解 1.第一种写法,在选项里面写 2.第二种,template标签模版 3.第三种,script标签模板,可以在外部引用
- .NET设计模式(16):模版方法(Template Method)
概述 变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对.如何更好的去抓住变化点,应对变化?如何更好的提高代码复用?通过学习Template Method模式,您应该有一个新的认识 ...
- C++设计模式 之 “组件协作”模式:Template Method、Strategy、Observer
"组件协作"模式: #现代软件专业分工之后的第一个结果是"框架与应用程序的划分","组件协作"模式通过晚期绑定,来实现框架与应用程序之间的松 ...
- vue-cli的webpack模版,相关配置文件dev-server.js与webpack.config.js配置解析
1.下载vue-cli [html] view plain copy npm install vue-cli -g vue-cli的使用与详细介绍,可以到github上获取https://github ...
- [vue] 说说你对选项el,template,render的理解
[vue] 说说你对选项el,template,render的理解 el: 把当前实例挂载在元素上 template: 实例模版, 可以是.vue中的template, 也可以是template选项, ...
- 模板模式(Template)
模板模式说明 模板是对多种事物的结构.形式.行为的模式化总结,而模板方法模式(Template Method)则是对一系列类行为(方法)的模式化 基类定义了一套模板(不可变),供子类继承,子类可以扩展 ...
- Vue源码解析:模版编译之来龙去脉(三)
本篇主要讲解,vue文本的解析.话不多说,先上源码: // 源码位于 src/compiler/parser/text-parsre.js const defaultTagRE = /\{\{((?: ...
- 理解vue之element-ui中的 template slot-scope=scope
如果有用过element-ui中的table组件,可能会发现有这么一个写法: <template slot-scope="scope"> 在实际的使用过程中,这种用法当 ...
- C++设计模式 温故知新李建忠(BooLan、GeekBand)
设计模式是前人的智慧和经验的总结,需要我们反复地学习.在实践中体会其蕴含的设计原则和设计思想.李老师按照封装变化将23种设计模式分成组件协作.单一职责.对象创建.对象性能.接口隔离.状态变化.数据结构 ...
最新文章
- 麦肯锡顾问的核心意识:成果决定价值
- Spring Boot项目部署到Heroku
- java 右键卡死_为什么右键单击不适用于Java应用程序?
- 1.1 objective-c中的内存管理
- 一个程序员必须学会的Github使用技巧
- 用代码向 90 后逝去的青春致敬!
- [转]使用Python MrJob的MapReduce实现电影推荐系统
- 强大的Common类库
- 罗德矢量网络分析仪高效测试软件NSAT-1000
- net configuration assistant 没反应_苗阜深夜发文:20年了没被打过,张玉浩,你已经离开青曲社了...
- U盘 安装 WIN7 ISO
- 英特尔cpu与主板芯片组对应关系(包含12代)
- hashcat破解WiFi显示No hashes loaded的解决方法
- 根据对数正态分布产生随机数
- 序列标注的BIO标注体系
- 基于哈工大LTP句子主干提取
- EEGLAB | 创建events事件导入eeglab
- 基于requests库和lxml库爬取优信二手车
- 高泽龙:下一个独角兽来自长租公寓,行业创新极大地释放租赁红利
- ZYNQ学习之路17.自定义SDSoC硬件平台
热门文章
- Eurek Ribbon Feign常见问题及解决
- mysql的length函数和char_length中文字符长度计算函数
- mysql存储数据到cephfs_采用cephfs实现Elasticsearch数据持久化
- Cortex-M3-异常与中断-向量表 s
- allegro 16.6/17.4 中如何将实心焊盘显示为空心焊盘
- 利用HttpClient 获取网页数据java代码模版
- caioj 1066 动态规划入门(一维一边推4:护卫队)(分组型dp总结)
- React版本更新及升级须知(持续更新)
- 短视频自研还是选择第三方?技术选型前必看的自检清单
- Robotium todolist.test.testcases.logout