一、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.final
C++中增加了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/