C++ final关键字

1.禁用继承

C++11中允许将类标记为final,方法时直接在类名称后面使用关键字final,如此,意味着继承该类会导致编译错误。

实例如下:

class Super final
{
  //......
};

 

2.禁用重写

C++中还允许将方法标记为fianal,这意味着无法再子类中重写该方法。这时final关键字至于方法参数列表后面,如下

class Super
{
  public:
    Supe();
    virtual void SomeMethod() final;
};

 

3.final函数和类

C++11的关键字final有两个用途。第一,它阻止了从类继承;第二,阻止一个虚函数的重载。我们先来看看final类吧。

程序员常常在没有意识到风险的情况下坚持从std::vector派生。在C++11中,无子类类型将被声明为如下所示:

class TaskManager {/*..*/} final; 
class PrioritizedTaskManager: public TaskManager {
};  //compilation error: base class TaskManager is final

 

同样,你可以通过声明它为final来禁止一个虚函数被进一步重载。如果一个派生类试图重载一个final函数,编译器就会报错:

class A
{
pulic:
  virtual void func() const;
};
class  B: A
{
pulic:
  void func() const override final; //OK
};
class C: B
{
pulic:
 void func()const; //error, B::func is final
};

C::func()是否声明为override没关系,一旦一个虚函数被声明为final,派生类不能再重载它。

参考资料

https://blog.csdn.net/u012333003/article/details/28696521
https://www.cnblogs.com/minggong/p/6457726.html

posted @ 2021-08-25 19:55  默行于世  阅读(566)  评论(0编辑  收藏  举报