使用final类说明符时,最终函数说明符是多余的吗?

时间:2017-04-30 09:10:11

标签: c++ c++11

当班级已经final时,有没有理由将函数指定为class B { public: virtual void f(); }; class D final : public B { public: virtual void f() final; // Redundant final? }; ?或者这是多余的?

final

这是一个很好的经验法则:开始制作整个班级final,并且只在需要从班级和/或覆盖中派生时切换到创建单独的函数# you need to use slice for w as well. This should work. df.loc[(slice(w),slice(None),y),('f','g')] df Out[208]: col1 f i col2 g h g h row1 row2 row3 (2, 2) (5, 5) 10 100 NaN NaN NaN 20 NaN NaN NaN NaN 30 NaN NaN NaN NaN 40 NaN NaN NaN NaN (4, 4) (5, 5) 10 NaN NaN NaN NaN 20 NaN NaN NaN NaN 30 NaN NaN NaN NaN 具体功能?

2 个答案:

答案 0 :(得分:4)

这绝对是多余的,因为将整个类标记为final使得无法从此类派生,因此可以覆盖任何内容。

  

9个班[班]

     
      
  1. 如果一个类使用class-virt-specifier final标记,并且它在base-clause中显示为base-type-specifier   (第10条),该计划格式不正确。
  2.   

因此,编译器甚至不会费心去检查从final类派生的类是否实际上试图覆盖任何内容。

答案 1 :(得分:0)

不,这不是多余的,因为final在应用于类和方法时意味着不同的东西。

  • final应用于某个类时,这意味着该类可能不会出现在另一个类的base-specifier-list中(即您无法继承它)

  • final应用于成员函数时,意味着该函数必须在祖先类中是虚拟的,并进一步指定它不能在后代类中重写。

关键区别在于成员函数上的final表示你必须覆盖祖先类中的虚方法 - 如果你不是,编译器抛出一个错误。应用于成员函数时,final基本上是override关键字的扩展名。

final应用于方法可以非常有助于捕获在类中仅指定final时无法捕获的细微错误。

示例1:如果您拼错了函数名称,或者没有完美地再现参数列表,则该函数实际上不会覆盖基本函数,并且在您认为它时不会被调用&# 39;将要被召唤。但是,如果您已指定函数为final(或override),则编译器将检测到您未成功覆盖基函数,并将抛出错误。如果您只指定该类为final,则编译器不会关心您的函数实际上是否覆盖了虚函数,并且不会抛出错误。

示例2:如果指定成员函数为final并且基类中的函数签名发生更改(例如,在您对代码进行测试和检查后,有人对基类进行了更改) ,编译器将有助于指出函数不再覆盖基函数。