一.传统多态->动多态

代码示例:

// 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)模版多态相关推荐

  1. vue template制作模版

    来源于技术胖的视屏讲解 1.第一种写法,在选项里面写 2.第二种,template标签模版 3.第三种,script标签模板,可以在外部引用

  2. .NET设计模式(16):模版方法(Template Method)

    概述 变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对.如何更好的去抓住变化点,应对变化?如何更好的提高代码复用?通过学习Template Method模式,您应该有一个新的认识 ...

  3. C++设计模式 之 “组件协作”模式:Template Method、Strategy、Observer

    "组件协作"模式: #现代软件专业分工之后的第一个结果是"框架与应用程序的划分","组件协作"模式通过晚期绑定,来实现框架与应用程序之间的松 ...

  4. 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 ...

  5. [vue] 说说你对选项el,template,render的理解

    [vue] 说说你对选项el,template,render的理解 el: 把当前实例挂载在元素上 template: 实例模版, 可以是.vue中的template, 也可以是template选项, ...

  6. 模板模式(Template)

    模板模式说明 模板是对多种事物的结构.形式.行为的模式化总结,而模板方法模式(Template Method)则是对一系列类行为(方法)的模式化 基类定义了一套模板(不可变),供子类继承,子类可以扩展 ...

  7. Vue源码解析:模版编译之来龙去脉(三)

    本篇主要讲解,vue文本的解析.话不多说,先上源码: // 源码位于 src/compiler/parser/text-parsre.js const defaultTagRE = /\{\{((?: ...

  8. 理解vue之element-ui中的 template slot-scope=scope

    如果有用过element-ui中的table组件,可能会发现有这么一个写法: <template slot-scope="scope"> 在实际的使用过程中,这种用法当 ...

  9. C++设计模式 温故知新李建忠(BooLan、GeekBand)

    设计模式是前人的智慧和经验的总结,需要我们反复地学习.在实践中体会其蕴含的设计原则和设计思想.李老师按照封装变化将23种设计模式分成组件协作.单一职责.对象创建.对象性能.接口隔离.状态变化.数据结构 ...

最新文章

  1. 麦肯锡顾问的核心意识:成果决定价值
  2. Spring Boot项目部署到Heroku
  3. java 右键卡死_为什么右键单击不适用于Java应用程序?
  4. 1.1 objective-c中的内存管理
  5. 一个程序员必须学会的Github使用技巧
  6. 用代码向 90 后逝去的青春致敬!
  7. [转]使用Python MrJob的MapReduce实现电影推荐系统
  8. 强大的Common类库
  9. 罗德矢量网络分析仪高效测试软件NSAT-1000
  10. net configuration assistant 没反应_苗阜深夜发文:20年了没被打过,张玉浩,你已经离开青曲社了...
  11. U盘 安装 WIN7 ISO
  12. 英特尔cpu与主板芯片组对应关系(包含12代)
  13. hashcat破解WiFi显示No hashes loaded的解决方法
  14. 根据对数正态分布产生随机数
  15. 序列标注的BIO标注体系
  16. 基于哈工大LTP句子主干提取
  17. EEGLAB | 创建events事件导入eeglab
  18. 基于requests库和lxml库爬取优信二手车
  19. 高泽龙:下一个独角兽来自长租公寓,行业创新极大地释放租赁红利
  20. ZYNQ学习之路17.自定义SDSoC硬件平台

热门文章

  1. Eurek Ribbon Feign常见问题及解决
  2. mysql的length函数和char_length中文字符长度计算函数
  3. mysql存储数据到cephfs_采用cephfs实现Elasticsearch数据持久化
  4. Cortex-M3-异常与中断-向量表 s
  5. allegro 16.6/17.4 中如何将实心焊盘显示为空心焊盘
  6. 利用HttpClient 获取网页数据java代码模版
  7. caioj 1066 动态规划入门(一维一边推4:护卫队)(分组型dp总结)
  8. React版本更新及升级须知(持续更新)
  9. 短视频自研还是选择第三方?技术选型前必看的自检清单
  10. Robotium todolist.test.testcases.logout