C++11新特性:final和override⼦类重写⽗类⽅法
生蚝煎蛋
下⾯的 final 和 override 都是写在派⽣类(⼦类)中⽗类声明的virtual虚函数后⾯。
例如:
1class father
2{
3public:
4 void test();
5 virtual void print();
6}
工程预算表7
8class son : public father
9{
10 //final关键字
11 void print() final;
12
13 //override关键字
14 void print() override;
15}
final和override关键字都是写在⼦类虚函数后⾯,他们有这不同的作⽤:
⼀:final豆皮怎么吃
⽤来在“中途”禁⽌派⽣类重写⽗类的⽅法。
例:有⽗类father和⼦类son和孙类grandson,继承关系是:grandson继承son,son继承father。
需求:son类中重写print()⽅法,grandson不能重写print()⽅法。
此时,要在son类重写⽗类print()后加“final”关键字来禁⽌grandson重写son类中的print()也就
小孩便秘吃什么是father类中的print()打工的我
盘游final关键字都是⽤于描述⼀个派⽣类的。那么基类中的虚函数是否可以使⽤final关键字呢?答案是肯定的,不过这样将使⽤该虚函数⽆法被重写,也就失去了虚函数的意义。如果不想成员函数被重写,程序员可以直接将该成员函数定义为⾮虚的。⽽final通常只在继承关系的“中途”终⽌派⽣类的重写中有意义。从接⼝派⽣的⾓度⽽
⾔,final可以在派⽣过程中任意地阻⽌⼀个接⼝的可重写性,这就给⾯向对象的程序员带来了更⼤的控制⼒。
⼆:override
城堡公主⽤来派⽣类(⼦类)⽤来检查此函数是否在⽗类中定义为虚函数。
例如:
假如我再sun类假如这样的函数:
void test() override;
void printttttt() override;
void print(int a) override;
上⾯的都是⽆法通过编译的。爱的表达
原因:⼀:⽗类中的函数test()并没有virtual关键字,没有加virtual是不允许重写的。
⼆:⽗类中并没有此虚函数(其实是程序员打错名字了)。
三:⽗类的print()是没有参数的。
从上⾯的例⼦可以知道,override是⽤来检查⽗类中的virtual函数的。因为如果不加override,就算按照上⾯的写是不会报错的,编译器会以为那3个都是你定义在⼦类中的函数。记住,要重写⽗类的⽅法,⼀定要名字和参数列表都⼀致,⽽且⽗类要有virtual关键字。