final作用:C++11中final关键字的作用是使派生类不可覆盖它所修饰的虚函数。
class Object
{
public:
Object() {};
virtual void Foo() {};
};
class Base : public Object
{
public:
Base() {};
void Foo() final {}; //声明为final
};
class Derived : public Base
{
public:
Derived() {};
void Foo() {}; //声明为“final”的函数无法被“Derived::Foo”重写
};
上例中,由于Base的Foo函数声明为final,使得它的派生类Derived不能覆盖其成员函数Foo即派生类不能重载其Foo函数。这样final可以在派生过程中任意地阻止一个接口的可重载性,给面向对象的程序员带来了更大的控制里。
override作用:指示函数重载的必须是其基类中的同名函数。
class Base
{
virtual void Turing() = 0;
virtual void Dijkstra() = 0;
virtual void VNeumann(int g) = 0;
virtual void DKnuth() const;
void Print();
};
class Derived : public Base
{
void Turing() override; //正常编译
void Dikjstra() override; //无法通过编译,拼写错误,并非重载
void VNeumann(double g) override; //无法通过编译,参数不一致,并非重载
void DKnuth() override; //无法通过编译,常量性不一致,并非重载
void Print() override; //无法通过编译,非虚函数重载
};
在C++中,重载有一个特点就是对基类声明为virtual的函数,之后的重载版本都不需要再声明该重载函数为virtual,这虽然带来了一些方便,同时也带来了一些阅读上的困难。在C++11中为了帮助程序员写继承结构复杂的类型,引入了虚函数描述符override,如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载的是其基类中的同名函数,否则代码将无法通过编译。