1. override:显示重写,强制编译器检查
- 作用就是子类的函数重写父类的虚函数,如果签名不匹配,编译器直接报错,避免写错函数名、参数、const,造成没有完成重写,变成隐藏新函数。
- override只是检测工具,本身不产生重写行为;必须父类是virtual虚函数。
#include <iostream>
using namespace std;
class Base
{
public:
virtual void show()
{
cout << "Base::show" << endl;
}
};
class Derived : public Base
{
public:
// 写错参数,没有重写,而是新增一个函数,多态失效!
void show(int a)
{
cout << "Derived::show" << endl;
}
};
int main()
{
Base* p = new Derived();
p->show(); // 输出 Base::show,多态失效,但是编译器不报警告
delete p;
return 0;
}
- 使用 override,编译直接捕获错误
class Derived : public Base
{
public:
// 编译报错,父类没有 void show(int),重写失败
void show(int a) override
{
cout << "Derived::show" << endl;
}
};
正确写法
class Derived : public Base
{
public:
void show() override // 签名完全匹配父类虚函数
{
cout << "Derived::show" << endl;
}
};
- 编码规范:重写虚函数,一律加上 override,杜绝隐形 bug。
2. final
修饰函数,禁止子类继续重写该虚函数
- 父类虚函数加final,后续继承的子类不能重写这个函数,重写直接编译报错。
class Base
{
public:
virtual void func() final
{
cout << "Base func" << endl;
}
};
class Son : public Base
{
public:
// 编译报错:func已经被final,不允许重写
void func() override
{
}
};
修饰类,禁止这个类被继承
- 类名后面加final,整个类禁止被继承,任何子类继承直接编译报错。
class grand final
{
};
// 编译报错,不能继承grand类
class Child : public grand
{
};
3. override he final 对比
| 特性 | override | final |
|---|---|---|
| 作用 | 验证是否正确重写父类虚函数 | 1. 虚函数:禁止子类重写2. 类:禁止类被继承 |
| 修饰对象 | 只能修饰类内虚成员函数 | 可以修饰虚函数 / 整个类 |
| 能否写在父类 | 不能,只写在子类重写函数上 | 写在父类;类 final 写在类名后面 |
| 对普通函数 | 不能修饰普通函数 | 不能修饰普通函数 |
| 运行时效果 | 无,仅编译期检查 | 无,仅编译期限制 |

浙公网安备 33010602011771号