C++11 override和final是否多余?

伽利略打小怪兽 2019-07-12 11:13:27
C++Primer对这两个关键字的描述
override:C++11新标准允许派生类显示地注明 它使用某个成员函数 覆盖了它继承的虚函数。
final:有时我们会定义这样一个类,我们不希望其他类继承它,或者不想考虑它是否适合作为一个基类。...C++11新标准提供了一种防止继承发生的方法,即在类名后跟一个关键字final。

想法很美好啊,但特别新增两条语法规则有必要吗???
对于override。若我想覆盖基类的虚函数,只需从基类代码中复制相应的虚函数声明(对,就是复制,ctrl+C永远比重新敲一遍声明快速而准确),再在本类中定义就是了。至于不想覆盖,那么本类什么都不做即是。
对于final。这是什么样的项目才会有这样“奇葩”的需求:不想自己的类被继承。就算有这样的需求,C++就是为满足小众需求,却增加了其他大部分人的学习成本。

顺便吐槽一下,现在C++的学习成本太高了,对于新人,坚决不建议入坑。有那精力,把python书翻几遍,工资照样不低。
...全文
249 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ggglivw 2019-07-15
  • 打赏
  • 举报
回复
引用 6 楼 伽利略打小怪兽 的回复:
[quote=引用 3 楼 sdghchj 的回复:]
这两个关键字本来就是从C#、java搬过来的,作用也就是语法加固而已。


也太博采众家之长了,看到别人好的就拿过来。功能是全了,但也增加了学习成本啊。
就拿auto来说。既然已经有了auto,那是不是int、short之类的变量类型可以删除了啊。
现在是既要学习变量类型,又要了解auto。[/quote]

你错了,auto是根据=右边来自动推导,如果根据右边无法推导, 你的auto会报编译错误
taodm 2019-07-12
  • 打赏
  • 举报
回复
项目大了,什么样的人都有。
ggglivw 2019-07-12
  • 打赏
  • 举报
回复
override 增加阅读性,至于final,我应该没有使用的需求
  • 打赏
  • 举报
回复
引用 12 楼 sdghchj 的回复:
protect这些是给编译器用的,防君子不防小人,程序员要用你的保护成员,有的是办法。C/C++是依赖头文件引入的,头文件就可以随便改。
你这个“头文件可以随便改”好可怕 C++难归难,还是得继续把书看下去啊。
sdghchj 2019-07-12
  • 打赏
  • 举报
回复
protect这些是给编译器用的,防君子不防小人,程序员要用你的保护成员,有的是办法。C/C++是依赖头文件引入的,头文件就可以随便改。
  • 打赏
  • 举报
回复
引用 10 楼 sdghchj 的回复:
[quote=引用 6 楼 伽利略打小怪兽 的回复:] [quote=引用 3 楼 sdghchj 的回复:] 这两个关键字本来就是从C#、java搬过来的,作用也就是语法加固而已。
也太博采众家之长了,看到别人好的就拿过来。功能是全了,但也增加了学习成本啊。 就拿auto来说。既然已经有了auto,那是不是int、short之类的变量类型可以删除了啊。 现在是既要学习变量类型,又要了解auto。[/quote] 删除int、short? 说明你还需要学习的太多。auto的作用你现在还是没搞清。C++是强类型语言,声明不一定要初始化。 auto在模板泛型编程的时候非常方便,是C++11的重要特性之一。 如果C++不发展,面临的只会是被淘汰,你就知足吧。 如果你觉得C++复杂,转golang吧,纯傻瓜式极其简单的语法,好多特性都没有,垃圾代码一大堆。[/quote] 分离式编译确实需要声明可以与定义分开。唉,越来越复杂了。吐槽归吐槽,还是得靠C++吃饭。 C++Primer又看到15.5章节中的 “改变个别成员可访问性”。 又吐血了,自己幸幸苦苦定义一个类,用protected保护成员不被派生类之外的用户访问。结果派生类使用using xxx,就把这个成员暴露了。唉。
sdghchj 2019-07-12
  • 打赏
  • 举报
回复
引用 6 楼 伽利略打小怪兽 的回复:
[quote=引用 3 楼 sdghchj 的回复:] 这两个关键字本来就是从C#、java搬过来的,作用也就是语法加固而已。
也太博采众家之长了,看到别人好的就拿过来。功能是全了,但也增加了学习成本啊。 就拿auto来说。既然已经有了auto,那是不是int、short之类的变量类型可以删除了啊。 现在是既要学习变量类型,又要了解auto。[/quote] 删除int、short? 说明你还需要学习的太多。auto的作用你现在还是没搞清。C++是强类型语言,声明不一定要初始化。 auto在模板泛型编程的时候非常方便,是C++11的重要特性之一。 如果C++不发展,面临的只会是被淘汰,你就知足吧。 如果你觉得C++复杂,转golang吧,纯傻瓜式极其简单的语法,好多特性都没有,垃圾代码一大堆。
  • 打赏
  • 举报
回复
引用 8 楼 sdghchj 的回复:
你可以继续使用C++03
唉,没办法,即使不用。面对面试官,这些说清楚了,也能加200块工资。
sdghchj 2019-07-12
  • 打赏
  • 举报
回复
你可以继续使用C++03
轻箬笠 2019-07-12
  • 打赏
  • 举报
回复
final好像在C#的main函数所在的类上见过。C++真心不知道干嘛用
  • 打赏
  • 举报
回复
引用 3 楼 sdghchj 的回复:
这两个关键字本来就是从C#、java搬过来的,作用也就是语法加固而已。
也太博采众家之长了,看到别人好的就拿过来。功能是全了,但也增加了学习成本啊。 就拿auto来说。既然已经有了auto,那是不是int、short之类的变量类型可以删除了啊。 现在是既要学习变量类型,又要了解auto。
sdghchj 2019-07-12
  • 打赏
  • 举报
回复
引用 4 楼 伽利略打小怪兽 的回复:
[quote=引用 3 楼 sdghchj 的回复:] 这两个关键字本来就是从C#、java搬过来的,作用也就是语法加固而已。
感觉是C++自己越来越不自信。各种特性,东拼西凑一样。 比如 auto 类似于之前看的一门脚本语言 var iValue = 1; var dValue = 3.1415926; var strValue = "hello wrold"; [/quote] 这是不自信吗? 博采众家之长才能发展得更好,别的不说,auto这种自动类型推导声明绝对是非常有必要的。
  • 打赏
  • 举报
回复
引用 3 楼 sdghchj 的回复:
这两个关键字本来就是从C#、java搬过来的,作用也就是语法加固而已。
感觉是C++自己越来越不自信。各种特性,东拼西凑一样。 比如 auto 类似于之前看的一门脚本语言 var iValue = 1; var dValue = 3.1415926; var strValue = "hello wrold";
sdghchj 2019-07-12
  • 打赏
  • 举报
回复
这两个关键字本来就是从C#、java搬过来的,作用也就是语法加固而已。

64,670

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧