C 箴言:理解隐式接口和编译期多态

文章作者 100test 发表时间 2007:05:12 12:20:36
来源 100Test.Com百考试题网


计算机等级考试训练软件《百宝箱》

object-oriented programming(面向对象编程)的世界是围绕着 explicit interfaces(显式接口)和 runtime polymorphism(执行期多态)为中心的。例如,给出下面这个(没有什么意义的)的 class(类)。

class Widget {
 public:
  Widget().
  virtual ~Widget().
  virtual std::size_t size() const.
  virtual void normalize().
  void swap(Widget&. other). // see Item 25

  ...
}.

  以及这个(同样没有什么意义)的 function(函数),

void doProcessing(Widget&. w)
{
 if (w.size() > 10 &.&. w != someNastyWidget) {
  Widget temp(w).
  temp.normalize().
  temp.swap(w).
 }
}

  我们可以这样谈论 doProcessing 中的 w:

  ·因为 w 被声明为 Widget 类型的引用,w 必须支持 Widget interface(接口)。我们可以在源代码中找到这个 interface(接口)(例如,Widget 的 .h 文件)以看清楚它是什么样子的,所以我们称其为一个 explicit interface(显式接口)——它在源代码中显式可见。

  ·因为 Widget 的一些 member functions(成员函数)是虚拟的,w 对这些函数的调用就表现为 runtime polymorphism(执行期多态):被调用的特定函数在执行期基于 w 的 dynamic type(动态类型)来确定(参见《C 箴言:绝不重定义继承的非虚拟函数》)。

  templates(模板)和 generic programming(泛型编程)的世界是根本不同的。在那个世界,explicit interfaces(显式接口)和 runtime polymorphism(执行期多态)继续存在,但是它们不那么重要了。作为替代,把 implicit interfaces(隐式接口)和 compile-time polymorphism(编译期多态)推到了前面。为了了解这是怎样一种情况,看一下当我们把 doProcessing 从一个 function(函数)转为一个 function template(函数模板)时会发生什么:

template
void doProcessing(T&. w)
{
 if (w.size() > 10 &.&. w != someNastyWidget) {
  T temp(w).
  temp.normalize().
  temp.swap(w).
 }
}

 



相关文章


定期归档Access数据库
VB6中使用Winsock穿越各种代理的实现
VB中代码创建数据库
如何编写异常安全的C 代码
C 箴言:理解隐式接口和编译期多态
编程指南:C语言编程易犯毛病集合
VB创建多线程应用程序(一)
VB创建多线程应用程序(二)
在WPS文档中更改图片原来可以更简单省事
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛