cpp11override 和 final 关键字
时间: 2023-05-30 07:06:10 浏览: 158
在C++11中,override和final是两个新的关键字,用于增强代码的安全性和可读性。
override:用于在派生类中重写基类的虚函数时,显式地告诉编译器此函数是重写基类的虚函数。如果重写时函数名、参数列表和返回类型都和基类的虚函数一致,但是没有加上override关键字,那么编译器无法判断是否是故意的重写,容易导致程序出错。加上override关键字后,编译器会在编译时检查是否真的重写了基类的虚函数,如果没有则会报错,从而避免了这种错误。
final:用于修饰类、函数或者变量,表示它们是终态的,不能被派生类、重写或者修改。在类中使用final关键字,表示该类不能被继承;在虚函数中使用final关键字,表示该虚函数不能被重写;在变量中使用final关键字,表示该变量是一个常量,不能被修改。使用final关键字可以增强代码的安全性和可读性,避免不必要的错误。
相关问题
c++final关键字
### C++ `final` 关键字使用说明
#### 类定义中的 `final`
当希望防止其他类从特定基类继承时,可以在类名后面加上 `final` 关键字。这会使得尝试从此类派生新类的行为成为编译错误。
```cpp
class NoInheritance final {
public:
virtual void method() {}
};
// 下面这段代码会导致编译失败,因为NoInheritance被标记为final
class TryToExtend : public NoInheritance {}; // 编译器报错
```
[^2]
#### 成员函数中的 `final`
对于虚函数而言,在其声明处添加 `final` 可以阻止后续派生类对该方法进行覆写。如果试图这样做,则会在编译阶段引发错误提示。
```cpp
#include <iostream>
using namespace std;
class Base {
public:
virtual void show() const { cout << "Base"; }
};
class Child : public Base {
public:
void show() const override final { cout << "Child"; }
};
class Grandchild : public Child {
public:
// 尝试重写show将会导致编译期错误, 因为在父级已被设置成final
//void show() const override {} // 错误: 不允许重写已标注final的方法
};
```
[^1][^3]
通过上述例子可以看出,一旦某个虚拟成员函数被指定为 `final` 后,即使再有更深一层的继承关系存在,也无法改变此行为的具体实现方式了。
C++中override和final
在C++中,`override`和`final`是两个关键字,用于控制类的继承和虚函数的重写。
`override`关键字用于明确地指定一个虚函数是覆盖了基类中的虚函数。如果一个函数使用了`override`关键字,则编译器会检查该函数是否确实覆盖了基类中的虚函数,如果没有,则会报编译错误。
例如:
```cpp
class Base {
public:
virtual void foo() {}
};
class Derived : public Base {
public:
void foo() override {}
};
```
在上面的代码中,`Derived`类中的`foo()`函数被标记为`override`,因此编译器会检查它是否确实覆盖了基类`Base`中的`foo()`函数。
`final`关键字用于禁止派生类重写虚函数,或者禁止派生类继承该类。如果一个类或函数使用了`final`关键字,则其派生类不能再重写该类或函数。例如:
```cpp
class Base {
public:
virtual void foo() final {}
};
class Derived : public Base {
public:
// 下面的代码会导致编译错误,因为foo()被标记为final,不能被重写
// void foo() {}
};
```
在上面的代码中,`Base`类中的`foo()`函数被标记为`final`,因此其派生类`Derived`不能再重写该函数。如果`Derived`类中尝试重写`foo()`函数,编译器会报错。
阅读全文