详解C++成员函数的override和final说明符的用法

 更新时间:2016年01月22日 14:40:35   投稿:goldensun  
这篇文章主要介绍了详解C++成员函数的override和final说明符的用法,分别用于重写和禁止继承类,要的朋友可以参考下

override 说明符

可使用 override 关键字来指定在基类中重写虚函数的成员函数。
语法

function-declaration override;

备注
override 仅在成员函数声明之后使用时才是区分上下文的且具有特殊含义;否则,它不是保留的关键字。
使用 override 有助于防止您的代码中出现意外的继承行为。以下示例演示在未使用 override 的情况下,可能不打算使用派生类的成员函数行为。编译器不会发出此代码的任何错误。

class BaseClass
{
  virtual void funcA();
  virtual void funcB() const;
  virtual void funcC(int = 0);
  void funcD();
};

class DerivedClass: public BaseClass
{
  virtual void funcA(); // ok, works as intended

  virtual void funcB(); // DerivedClass::funcB() is non-const, so it does not
             // override BaseClass::funcB() const and it is a new member function

  virtual void funcC(double = 0.0); // DerivedClass::funcC(double) has a different
                   // parameter type than BaseClass::funcC(int), so
                   // DerivedClass::funcC(double) is a new member function

};

当使用 override 时,编译器会生成错误,而不会在不提示的情况下创建新的成员函数。

class BaseClass
{
  virtual void funcA();
  virtual void funcB() const;
  virtual void funcC(int = 0);
  void funcD();
};

class DerivedClass: public BaseClass
{
  virtual void funcA() override; // ok

  virtual void funcB() override; // compiler error: DerivedClass::funcB() does not 
                  // override BaseClass::funcB() const

  virtual void funcC( double = 0.0 ) override; // compiler error: 
                         // DerivedClass::funcC(double) does not 
                         // override BaseClass::funcC(int)

  void funcD() override; // compiler error: DerivedClass::funcD() does not 
              // override the non-virtual BaseClass::funcD()
};


若要指定不能重写函数且不能继承类,请使用 final 关键字。


final 说明符
可以使用 final 关键字指定无法在派生类中重写的虚函数。您还可以使用它指定无法继承的类。
语法

function-declaration final;

class class-name final base-classes

备注
final 只有在函数声明或类名称后使用时才是区分上下文的且具有特殊含义;否则,它不是保留的关键字。
在类声明中使用 final 时,base-classes 是声明的可选部分。
下面的示例使用 final 关键字指定无法重写虚函数。

class BaseClass
{
  virtual void func() final;
};

class DerivedClass: public BaseClass
{
  virtual void func(); // compiler error: attempting to 
             // override a final function
};

有关如何指定可以重写成员函数的信息,请参阅 override 说明符"。
下一个示例使用 final 关键字指定无法继承类。

class BaseClass final 
{
};

class DerivedClass: public BaseClass // compiler error: BaseClass is 
                   // marked as non-inheritable
{
};

相关文章

  • ubuntu修改gcc版本的操作方法

    ubuntu修改gcc版本的操作方法

    今天小编就为大家分享一篇ubuntu修改gcc版本的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • C++实现一个简易版的事件(Event)的示例代码

    C++实现一个简易版的事件(Event)的示例代码

    之前在 windows系统中开发应用时, 遇到需要进行线程同步的时候几乎都是使用的事件内核对象 Event。本文为大家整理了C++实现一个简易版的事件(Event)的相关资料,需要的可以参考一下
    2022-11-11
  • C语言驱动开发之内核解锁与强删文件

    C语言驱动开发之内核解锁与强删文件

    在某些时候我们的系统中会出现一些无法被正常删除的文件,如果想要强制删除则需要在驱动层面对其进行解锁后才可删掉,本文为大家介绍了内核解锁与强删文件的方法,希望对大家有所帮助
    2023-06-06
  • C语言动态规划多种背包问题分析讲解

    C语言动态规划多种背包问题分析讲解

    背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高
    2022-04-04
  • C语言数据结构之栈和队列的实现及应用

    C语言数据结构之栈和队列的实现及应用

    栈和队列是一种数据结构,只规定了性质,并没有规定实现方式。本文将以顺序结构实现栈,链表方式实现队列,感兴趣的小伙伴快跟随小编一起学习一下吧
    2022-08-08
  • C++中NULL与nullptr的区别对比

    C++中NULL与nullptr的区别对比

    nullptr是c++11中的关键字,下面这篇文章主要介绍了C++中NULL与nullptr区别的相关资料,对大家来说还是挺实用的,需要的朋友可以参考下
    2021-05-05
  • VC6.0常用快捷键大全

    VC6.0常用快捷键大全

    这篇文章主要介绍了VC6.0常用快捷键大全,非常实用,需要的朋友可以参考下
    2014-08-08
  • GCC 编译c程序的方法及过程解析

    GCC 编译c程序的方法及过程解析

    目前 Linux 下最常用的 C 语言编译器是 GCC ( GNU Compiler Collection ),它是 GNU 项目中符合 ANSI C 标准的编译系统,能够编译用 C 、 C++ 和 Object C 等语言编写的程序
    2014-01-01
  • C语言中无符号与有符号及相加问题

    C语言中无符号与有符号及相加问题

    这篇文章主要介绍了C语言中无符号与有符号及相加问题,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • C++中的static和const的关键字用法详解

    C++中的static和const的关键字用法详解

    这篇文章主要介绍了C++中的static和const的关键字用法详解,这是一道经常在面试中被问到的知识,本文给大家详细介绍下,需要的朋友可以参考下
    2023-06-06

最新评论