当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

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

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);
 }
}


  现在我们可以如何谈论 doProcessing 中的 w 呢?

  ·w 必须支持的 interface(接口)是通过 template(模板)中在 w 身上所执行的操作确定的。在本例中,它显现为 w 的 type (T) 必须支持 size,normalize 和 swap member functions(成员函数);copy construction(拷贝构造函数)(用于创建 temp);以及对不等于的比较(用于和 someNastyWidget 之间的比较)。我们将在以后看到这并不很精确,但是对于现在来说它已经足够正确了。重要的是这一系列必须有效地适合于模板编译的表达式是 T 必须支持的 implicit interface(隐式接口)。

  ·对诸如 operator> 和 operator!= 这样的包含 w 的函数的调用可能伴随 instantiating templates(实例化模板)以使这些调用成功。这样的 instantiation(实例化)发生在编译期间。因为用不同的 template parameters(模板参数)实例化 function templates(函数模板)导致不同的函数被调用,因此以 compile-time polymorphism(编译期多态)著称。

  即使你从没有使用过模板,你也应该熟悉 runtime(运行期)和 compile-time polymorphism(编译期多态)之间的区别,因为它类似于确定一系列重载函数中哪一个应该被调用的过程(这个发生在编译期)和 virtual function(虚拟函数)调用的 dynamic binding(动态绑定)(这个发生在运行期)之间的区别。explicit(显式)和 implicit interfaces(隐式接口)之间的区别是与 template(模板)有关的新内容,需要对他进行近距离的考察。

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接