博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
隐式接口和编译期多态
阅读量:5320 次
发布时间:2019-06-14

本文共 1598 字,大约阅读时间需要 5 分钟。

oop都是以显示接口和运行期多态解决问题;

Template和泛型编程以隐式接口和编译期多态解决问题。

----------------------------------------------------------------------------------------------------------------------------------------------

classes和template都支持接口和多态。

对于classes而言接口是显式的,以函数签名为中心;多态是通过virtual函数发生在运行期。

对于template而言接口是隐式的,取决于有效表达式;多态是通过template具现化和函数重载解析发生于编译期。

----------------------------------------------------------------------------------------------------------------------------------------------

class Widget

{

public:

  Widget();

  virtual ~Widget();

  virtual std::size_t size() const;

  virtual void normalize();

  void swap(Widget& other);

};

显示接口由函数的签名式(函数名称、参数类型、返回类型)构成:

一个构造函数、一个析构函数、函数size、normalize、swap以及其参数类型、返回类型、常量性构成;

当然也包括编译期产生的copy构造函数、copy assignment操作符。另外也可以包括typedef。

运行期多态:

由于有virtual函数,那么函数的调用将取决于运行期w的动态类型。(换句话说就是,virtual函数的调用不在编译期决定,而是在运行期决定调用哪个virtual函数:base class的版本还是derived class的版本)

 

template<typename T>

void doProcessing( T& w)

{

  if(w.size() > 10 && w != someNsatyWifget)

  {…}

}

隐式接口并不基于函数的签名式。而是由有效表达式组成:

T的隐式接口看起来好像有这么约束:

1.他必须提供一个名为size的函数,该函数返回一个整数值。

2.他必须支持一个opreator!=函数,用来比较家两个T对象。这里我们假设someNastyWidget的类型是T。

size成员函数可能是从base class 继承而来的,所以它不需要返回一个数值类型。

T并不需要支持opreator!=,因为opreator!=接收一个类型为x的对象那个和一个类型为y的对象,T可被转换为x而someNastyWidget的类型可被转换成y,这样就可以有效调用!=了。

虽然具体确定隐式接口很难,但是我们整体确认表达式约束条件却很简单,if语句的条件句必须是个布尔表达式。这是template doProcessing加诸于其类型参数T的隐式接口的一部分。其他的隐式接口是:copy构造函数、normalize和swap也都必须对T类型对象有效。

编译期多态:

对于w的任何函数调用,都有可能造成template具现化。

这些行为发生在编译期。

以不同的template参数具现化function template会导致调用不同的函数,这就是编译期多态。

 

Ps:显示接口和隐式接口都在编译期完成检查。

转载于:https://www.cnblogs.com/qiushuixiaozhanshi/p/5716201.html

你可能感兴趣的文章
【UVA 1380】 A Scheduling Problem (树形DP)
查看>>
数学符号?
查看>>
山东省第四届蓝桥杯 ///题目标题:前缀判断//c/c++组
查看>>
sql server实现主从复制
查看>>
Aras 引入外部的dll
查看>>
走楼梯
查看>>
C# JSON字符串序列化与反序列化
查看>>
HTTPS、SPDY和HTTP/2的性能比较
查看>>
GRPC单向/双向流
查看>>
Ubuntu18.10下配置PHP7.2 + Apache2 + Mysql5.7
查看>>
Java变量类型,实例变量 与局部变量 静态变量
查看>>
Angular实践----理解数据绑定过程
查看>>
sublime快捷键
查看>>
mysql操作命令梳理(4)-中文乱码问题
查看>>
Hyper-V Centos7 网络设置 虚拟机固定IP
查看>>
Python环境搭建(安装、验证与卸载)
查看>>
android菜鸟学习笔记5----第一个android程序
查看>>
2.5 非透明PCI桥 分类: 浅谈PCI 2...
查看>>
POJ 2263 Heavy Cargo(Floyd + map)
查看>>
Macbook pro 下修改MySQL数据库密码
查看>>