6.1final关键字
C++11中增加了 final关键字来限制某个类不能被继承,或者某个虚函数不能被重写。如果修饰函final只能修饰虚函数,并且要放到类或者函数的后面。下面是 final 的用法:
class A
{
public:
virtual void fun()final;//限定该虚函数不能被重写
void bar()final;//error,final关键字只能修饰虚函数
};
class B final : public A//限定B类不能派生出新的类型,不能被继承
{
public:
virtual void fun();//error,在A类中fun函数被限定不能重写
};
class C:public B//error,B类不能被继承
{};
6.2override关键字
override 关键字确保在派生类中声明的重写函数与基类的虚函数有相同的签名,同时也明确表明将会重写基类的虚函数,还可以防止因疏忽把本来想重写基类的虚函数声明成隐藏。这样,既可以保证重写虚函数的正确性,又可以提高代码的可读性。override关键字和 final关键字一样,需要放到方法后面。
class A
{
public:
virtual void func(){}
};
class B:public A
{
public:
void func()override//提醒程序员要进行重写,且要和基类的虚函数达到三同
{}
};
6.3动态多态和静态多态的优缺点比较
静态多态优点:由于静多态是在编译期完成的,因此效率较高,编译器也可以进行优化;有很强的适配性和松耦合性,比如可以通过部分特化、完全特化来处理特殊类型,最重要一点是静态多态通过模板编程为C++带来了泛型设计的概念,比如强大的STL库。
静态多态缺点:由于是模板来实现静态多态,因此模板的不足也就是静多态的劣势,比如调试困难、编译耗时、代码膨胀、编译器支持的兼容性不能够处理异质对象集合。
动态多态优点:00设计,对是客观世界的直觉认识,实现与接口分离,可复用处理同一继承体系下异质对象集合的强大威力。
动态多态缺点:运行期绑定,导致一定程度的运行时开销;编译器无法对虚函数进行优化笨重的类继承体系,对接口的修改影响整个类层次。
不同点:本质不同,静态多态在编译期决定,由模板具现完成,而动态多态在运行期决定,由继承、虚函数实现;动态多态中接口是显式的,以函数签名为中心,多态通过虚函数在运行期实现,静态多台中接口是隐式的,以有效表达式为中心,多态通过模板具现在编译期完成。
相同点:都能够实现多态性,静态多态/编译期多态、动态多态/运行期多态;都能够使接口和实现相分离,一个是模板定义接口,类型参数定义实现,一个是基类虚函数定义接口继承类负责实现。