隐式接口和编译期多态
2018-06-17 23:56:23来源:未知 阅读 ()
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:显示接口和隐式接口都在编译期完成检查。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 在名称空间中使用using声明和using编译指令 2020-05-29
- C++ 单独编译 2020-05-10
- G++编译链接的那些事!G++的特殊使用方法[常用] 2020-04-19
- Code::Blocks20.03 编译报错 2020-04-17
- g++链接gcc编译的库报错“undefined reference to xxx” 2020-04-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash