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(函数模板)时会发生什么:

时间: 2024-11-01 19:52:30

C++箴言:理解隐式接口和编译期多态的相关文章

C++:显示接口&运行期多态 和 隐式接口&编译期多态

类(class)和面向对象: 显示接口(explicit interface): 即在源代码中可见, 可以在头文件内看到类的所有接口; 运行期多态(runtime polymorphism):成员函数是virtual, 传入类的引用或指针时, 在运行时, 会自动匹配接口, 可能是基类的接口, 也可能是派生类的; 模板(templates)和泛型编程(generic programming): 隐式接口(implicit interface):typename T, 在函数中, 所必须支持一组操作

C# 接口的隐式与显示实现及适应场景_实用技巧

以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习. 通俗的来讲,"显示接口实现"就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:"隐式接口实现".费话不说,例子如下: 复制代码 代码如下: interface IAnimal { void Dog(); } class Animal:IAnimal { public void Dog() { Console.Wri

Scala入门到精通——第十八节 隐式转换与隐式参数(一)

本节主要内容 隐式转换简介 隐式转换函数 隐式转换规则 隐式参数 1. 隐式转换简介 在scala语言当中,隐式转换是一项强大的程序语言功能,它不仅能够简化程序设计,也能够使程序具有很强的灵活性.要想更进一步地掌握scala语言,了解其隐式转换的作用与原理是很有必要的,否则很难得以应手地处理日常开发中的问题. 在scala语言中,隐式转换是无处不在的,只不过scala语言为我们隐藏了相应的细节,例如scala中的类继承层次结构中: 它们存在固有的隐式转换,不需要人工进行干预,例如Float在必要

C#的隐式引用转换

隐式引用转换包括以下几类: ●从任何引用类型到对象类型的转换 ●从类类型s到类类型t的转换,其中s是t的派生类. ●从类类型s到接口类型t的转换,其中类s实现了接口t. ●从接口类型s到接口类型t的转换,其中t是s的父接口. 从元素类型为Ts的数组类型S向元素类型为Tt的数组类型T转换,这种转换需要满足下列条件: ●S和T只有元素的数据类型不同,但它们的维数相同. ●Ts和Tt都是引用类型. ●存在从Ts到Tt的隐式引用转换 ●从任何数组类型到System.Array的转换. ●从任何代表类型到

动态链接库-在VS中调用已存在的DLL,隐式链接和显示连接都编译不通过

问题描述 在VS中调用已存在的DLL,隐式链接和显示连接都编译不通过 新建一个Win32控制台应用程序,想在其中调用MyDll中的函数. 采用隐式配置方案时,出现MyDll.lib找不到,无法打开!!! 采用显示的#pragma comment(lib,"MyDll.lib") #include #pragma comment(lib,"G://My programDynamicLibraryDebug__ltp_dll.lib") //#include "

tosingle隐式转换怎么理解啊

问题描述 我是一个c#新手,自学过程中遇到了一个问题:什么是隐式转换?什么时候用tosingle隐式转换,什么时候用toint32转换?这两种转换有什么区别?谢谢你: 解决方案 解决方案二:隐式转换就是没有调用转换方法,由系统自动完成的转换,只能发生在较"小"的类型转换到更"大"的类型之时,比如float(Single)到Double,byte到short,short到int...与此对应的显式转换,发生在较"大"的类型到较"小&quo

深入理解Java的接口与抽象类_java

对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 一.抽象类 在了解抽象类之前,先来了解一下抽象方法.抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.抽象方法的声明格式为:    abstract void

C#3.0新特性之隐式类型局部变量的使用

变量 首先说明一下,此新特性的专题基于MS五月份分布的C#3.0规范,但是官方中文版还没有出来,结合自己的实践和理解,希望能和大家一起分享某些前沿的东东,很有可能一些地方会出错,望抛砖. 在C# 3.0里面, 可以对局部变量进行隐式类型声明, 就是在声明时可以不指定该变量的类型, 变量在初始化的时候会由编译器从表达式的上下文中推出真正的类型, 对开发者来说, 无疑是简化了很多, 主要是通过新的关键字var, 有如下面的例子: var i = 5;var s = "Hello";var

JSP隐式对象和MVC设计模式

 今天我们一起来了解一下关于JSP应用的JSP的隐式对像和MVC设计模式. 首先我们先来说一下JSP的隐式对象:JSP隐式对象是Web容器加载的一组类的实例.它是可以直接在JSP页面使用的对象.分为4个主要类别:1. 输入和输出对象:控制页面的输入和输出(request.response.out). 2. 作用域通信对象:检索与JSP页面的Servlet相关的信息(session.application.pageContext). 3. Servlet对象:提供有关页面环境的信息(page.co