type
date
status
slug
summary
tags
category
icon
password
网址
C++11中增加了 final关键字来限制某个类不能被继承,或者某个虚函数不能被重写。如果修饰函数,final只能修饰虚函数,并且要放到类或者函数的后面。下面是 final 的用法∶
override 关键字确保在派生类中声明的重写函数与基类的虚函数有相同的签名,同时也明确表明将会重写基类的虚函数,还可以防止因疏忽把本来想重写基类的虚函数声明成隐藏。这样,既可以保证重写虚函数的正确性,又可以提高代码的可读性。override关键字和 final关键字一样,需要放到方法后面。
动态多态的设计思想:
对于相关的类型,确定它们之间的一个共同特征,(属性和方法),将共同特征被转移到基类中,
然后在基类中,把这些共同的功能声明为多个公有的虚函数接口。各个派生类继承基类,并重写这些虚函数,以完成具体的功能。这种设计使得共性很清楚,避免了代码重复,将来容易增强功能,并易于长期维护。
客户端的代码(操作函数)通过基类的引用或指针来指向这些对象,对虚函数的调用会自动绑定到
实际提供功能的派生类对象上。
静态多态的设计思想:
对于相关的类型,直接实现它们各自的定义,不需要共有基类,甚至可以没有任何关系。只需要各
个具体类的实现中要求相同的接口声明,这里的接口称之为隐式接口。客户端把操作这些对象的函数定义为模板,当需要操作什么类型的对象时,直接对模板指定该类型实参即可(或通过实参演绎获得)。
相对于面向对象编程中,以显式接口和运行期多态(虚函数)实现动态多态,在模板编程及泛型编
程中,是以隐式接口和编译器多态来实现静态多态。
静态多态本质上就是模板的具现化。静态多态中的接口调用也叫做隐式接口,相对于显示接口由函
数的签名式(也就是函数名称、参数类型、返回类型)构成,隐式接口通常由有效表达式组成。
动态多态和静态多态的优缺点比较:
静态多态优点:由于静多态是在编译期完成的,因此效率较高,编译器也可以进行优化;有很强的
适配性和松耦合性,比如可以通过部分特化、完全特化来处理特殊类型;最重要一点是静态多态通过模板编程为C++带来了泛型设计的概念,比如强大的STL库。缺点:由于是模板来实现静态多态,因此模板的不足也就是静多态的劣势,比如调试困难、编译耗时、代码膨胀、编译器支持的兼容性不能够处理异质对象集合
动态多态
优点:OO设计,对是客观世界的直觉认识;实现与接口分离,可复用处理同一继承体系下异质对象集合的强大威力缺点:运行期绑定,导致一定程度的运行时开销;编译器无法对虚函数进行优化
笨重的类继承体系,对接口的修改影响整个类层次;
不同点:本质不同,静态多态在编译期决定,由模板具现完成,而动态多态在运行期决定,由继承、虚函数实现;动态多态中接口是显式的,以函数签名为中心,多态通过虚函数在运行期实现,静态多台中接口是隐式的,以有效表达式为中心,多态通过模板具现在编译期完成相同点:都能够实现多态性,静态多态/编译期多态、动态多态/运行期多态;
都能够使接口和实现相分离,一个是模板定义接口,类型参数定义实现,一个是基类虚函数定义接口,继承类负责实现;