一、final
C++中增加了final关键字,作用如下:
① 限制某个类不能被继承② 或者某个虚函数不能被重写
① 限制某个类不能被继承
// ① 限制某个类不能被继承,也就是说这个类不能有派生类
class Base{
public:virtual void print() {cout<<"Base class...";}
};class Child final: public Base{
public:void test() {cout<<"Child class...";}
};// error,语法错误
class GrandChild : public Child {
public:};/*总结:final修饰的Child类,派生类GrandChild类的继承是非法的,不允许的
*/
总结: final修饰的Child类,派生类GrandChild类的继承是非法的,不允许的
② 或者某个虚函数不能被重写
若使用 final 修饰函数,只能修饰虚函数,并且要把 final 关键字放到类或者函数的后面
#include <iostream>
using namespace std;/*1.finalC++中增加了final关键字,作用如下:① 限制某个类不能被继承② 或者某个虚函数不能被重写若使用 final 修饰函数,只能修饰虚函数,并且要把 final 关键字放到类或者函数的后面
*/
// 基类: base
class Base{
public:virtual void print() {cout<< "Base class..." <<endl;}
};// 子类: Child
class Child : public Base {
public:void print() final {cout<< "Child class..." <<endl;}
};// 孙子类: GrandChild
class GrandChild : public Child {
public:// 语法错误,不允许重写/*void print(){ //error: overriding final function ‘virtual void Child::print()’cout<<"GrandChild class...";}*/
};int main() {GrandChild gc;gc.print();//Child class...return 0;
}
/*总结:print()是基类中的一个虚函数,在子类中重写了这个方法,且使用了 final 关键字表示不希望孙子类继续重写这个方法了。因此孙子类对这个方法只能使用不能重写。
*/
总结:print()是基类中的一个虚函数,在子类中重写了这个方法,且使用了 final 关键字表示不希望孙子类继续重写这个方法了。因此孙子类对这个方法只能使用不能重写。
二、override
override① override关键字和final一样,需要写到方法的后面② 确保在派生类中声明的重写函数与基类的虚函数有相同的签名③ 表明将会重写基类的虚函数,可保证重写的虚函数的正确性④ 提高代码可读性
#include<iostream>
using namespace std;
/*override① override关键字和final一样,需要写到方法的后面② 确保在派生类中声明的重写函数与基类的虚函数有相同的签名③ 表明将会重写基类的虚函数,可保证重写的虚函数的正确性④ 提高代码可读性
*/
// 基类: Base
class Base{
public:virtual void print() {cout<<"Base class...\n";}
};// 子类: Child
class Child : public Base{
public:void print() override {cout<<"Child class...\n";}
};// 孙子类: GrandChild
class GrandChild : public Child{
public:void print() override {cout<<"GrandChild class...\n";}
};int main() {Base bs;Child cd;GrandChild gc;bs.print();cd.print();gc.print();return 0;
}
若派生类指定了要重写父类的print()方法,使用了 override关键字之后,若写错函数名或者函数参数或者返回值,那么编译器都会提示语法错误,因此有利于提高程序的正确性,降低出错的概率。
学习和参考一下文章:
final和override | 爱编程的大丙 (subingwen.cn)https://subingwen.cn/cpp/final/