• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

细谈C++多态性的“动”与“静”

发布: 2008-6-10 16:33 | 作者: 不详 | 来源: 天极网 | 查看: 70次 | 进入软件测试论坛讨论

领测软件测试网 关键字:C++ “动”与“静”

 在我们讨论多态的时候,先看看什么是硬编码和软编码:硬编码就是把代码写死了,导致弹性不足,降低了可扩展性,例如在代码里的: if...else...;switch...case...
  
  这些代码通常都属于硬编码,项目中的这些代码多了,就相当于说明这个代码的灵活性、扩展性、弹性等等的少了。

  所以,我们要尽量使用软编码,通俗点就是“别把话说死了,留点转弯的余地”。多态性就是这种软编码特性的反映,下面我们一起来研究一下多态性。

  多态性是一种抽象,把事物的特征抽象出来,然后事物的具体形态我们就不关心了。

  例如对工人这种事物来说,他的特征就是工作,至于是什么工人,他做什么工作,我们就不用关心了,只要我们以“工人.工作”这种方式去调用。那他就会为我们工作了。

  那为什么我们不抽象出其他的特征,只抽象出工作这个特征呢?因为我们只对这个特征感兴趣,他的什么吃饭、睡觉、如厕等的特性我们都不关心了。有了多态,我们就可以实现软编码了!

  讲解了多态的概念之后,我们来看看多态的实现(C++的实现):

  多态的实现是通过虚函数表(VTable),每个类如果有虚函数,那它就有一个虚函数表,所有的对象都共享这一个VTable。这个概念也叫做动态联编,还有静态联编,这些概念都是通过在程序执行的时候表现出来的性质来定的,我们下面会看看它的“动”和“静”究竟体现在哪里。

  先看一段代码:

  class C0
  ...{
  public:
  void Test()
  ...{
  cout << "call C0 Test()。" << endl;
  }
  };

  这个类没有虚函数,调用的时候就是静态调用。调用的代码如下:

  // 静态编译(早绑定 early binding)
  C0 *pO0;
  C0 obj0;
  pO0 = &obj0;
  pO0->Test();
  它的反汇编代码如下:

  // 直接调用函数(已经知道地址)
  00401432 mov ecx,dword ptr [ebp-0Ch]
  00401435 call @ILT+160(C0::Test) (004010a5)
  下面看看带虚函数的类:

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

TAG: 多态

31/3123>

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网