c++ final关键字
时间: 2023-12-22 15:28:09 浏览: 125
C++11中的final关键字有两个用途:阻止类被继承和阻止虚函数被重载。
1. final关键字修饰类,阻止类被继承
```c++
class Base final {
// ...
};
// 以下代码会编译错误,因为Derived类试图继承final类Base
class Derived : public Base {
// ...
};
```
2. final关键字修饰虚函数,阻止虚函数被重载
```c++
class Base {
public:
virtual void foo() final {
// ...
}
};
class Derived : public Base {
public:
// 以下代码会编译错误,因为Derived类试图重载final函数foo
virtual void foo() {
// ...
}
};
```
相关问题
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++11 override和final关键字
C++11中的`override`和`final`关键字是为了增强代码的编译时类型检查和面向对象设计中的继承机制。
`override`关键字用于显示地表明派生类中的成员函数覆盖了基类中的虚函数。当派生类中的函数与基类中的虚函数签名不同或者没有使用`override`关键字时,编译器会给出警告或错误提示。这样可以避免因为函数签名不同而无法正确覆盖基类中的虚函数,从而导致程序运行时的错误。例如:
```c++
class Base {
public:
virtual void foo(int x);
};
class Derived : public Base {
public:
void foo(float x) override; // 错误,签名不同,编译器会提示错误
void foo(int x) override; // 正确
};
```
`final`关键字用于显示地防止在派生类中重载某个函数。如果在一个虚函数上使用了`final`关键字,那么任何派生类都无法再对该函数进行重载。例如:
```c++
class Base {
public:
virtual void foo();
};
class Derived : public Base {
public:
void foo() override final; // Derived中的任何派生类都无法重载foo函数
};
class DerivedDerived : public Derived {
public:
void foo() override; // 错误,DerivedDerived中无法重载foo函数
};
```
使用`override`和`final`关键字可以帮助程序员避免一些常见的错误,同时也可以提高代码的可读性和维护性。
阅读全文