博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么需要override关键字
阅读量:4124 次
发布时间:2019-05-25

本文共 1224 字,大约阅读时间需要 4 分钟。

为什么需要override关键字

override是Object Pacsal和C#的一个关键字,用来表示一个方法是个重载方法(好像Java 1.5里也有,我对Java不是很了解),刚开始接触C#时还觉得这个关键字挺多余的,但仔细琢磨就能明白,这是个非常有用的关键字。C++就没有这个关键字,在声明虚函数时,只需要在函数声明前加上关键字virtual,而在重载虚函数时virtual则是可选的。即使在子类中写上了virtual,也并不清楚这个函数是被首次声明,还是重载了基类中的虚函数。更为严重的是,如果不看基类的声明或借助注释,根本没有办法知道一个函数是否是虚函数(我是指程序员看源代码时不知道,运行时的方法不在此讨论范围内)。有一次我整理数个月前写的C++代码,看到其中一个类成员函数只是简单的返回了一个成员变量的值,我觉得这样的成员函数应该声明为const,从而也能适用于const实例的情况。但就这样一来程序运行结果不正确了,经过仔细的跟踪,我才发现原来这个函数在基类中就被声明为virtual,子类中这个版本实际上是个重载版本,而我加上const后导致它的签名和基类中的版本不一样了,从而编译器不再认为它重载了基类中的虚函数,而是一个全新的函数了。对此编译器不能给出任何有用的信息,只能人工一点一点的检查。而如果像C#那样要求使用C#关键字,子类中的重载版本就必须加上override,这样一来一眼就可以知道它是个重载方法,我们也就不会随意改动它的签名了。

override的要求是:
1 对于非重载方法,不能添加override关键字,否则会产生编译错误
2 对于重载方法,必须使用override关键字;如果要隐藏基类中的方法,则需要使用new关键字
3 与IDE相配合,只要在Visual Studio.Net中输入override并空格,就可以自动列出基类中所有可重载的方法

对此,我想借助C++的typedef、模板或宏的功能,也许可以模拟出override关键字的功能

我的一种不成形的想法是:
1 把VIRTUAL定义为virtual,并再进行一个关于所编写的虚函数名的宏定义,把它定义为不合法,使得子类中直接重载它时就会产生编译时错误
2 定义OVERRIDE,它先检查是否已经有了对所重载函数名的不合法定义,如果没有,就定义一个不合法的结果,从而产生编译期错误,这样一来就不能对非重载函数应用OVERRIDE关键字
3 如果已经有了不合法定义,让它先取消对所重载函数名的不合法定义,然后正常的重载,重载后再重新进行不合法定义,这样一来就可以正确的重载虚函数
4 但这样还有一些问题,就是在写重载函数的实现时,以及调用被这样声明的函数时,都会有一些问题,因为相应的函数名已经被定义为不合法,不能直接使用。可能还需要进行更复杂的宏定义才能解决。
想法如此,但具体实现起来问题也不少,我还没有实验成功,先把想法保存于此,备查。 

转载地址:http://xcopi.baihongyu.com/

你可能感兴趣的文章
浅谈JavaScript的语言特性
查看>>
LeetCode第39题思悟——组合总和(combination-sum)
查看>>
LeetCode第43题思悟——字符串相乘(multiply-strings)
查看>>
LeetCode第44题思悟——通配符匹配(wildcard-matching)
查看>>
LeetCode第45题思悟——跳跃游戏(jump-game-ii)
查看>>
LeetCode第46题思悟——全排列(permutations)
查看>>
LeetCode第47题思悟—— 全排列 II(permutations-ii)
查看>>
LeetCode第48题思悟——旋转图像(rotate-image)
查看>>
驱动力3.0,动力全开~
查看>>
记CSDN访问量10万+
查看>>
Linux下Oracle数据库账户被锁:the account is locked问题的解决
查看>>
记CSDN访问20万+
查看>>
Windows 环境下Webstorm 2020.3 版本在右下角找不到Git分支切换部件的一种解决方法
查看>>
Electron-Vue项目中遇到fs.rm is not a function问题的解决过程
查看>>
飞机换乘次数最少问题的两种解决方案
查看>>
有向无回路图的理解
查看>>
设计模式中英文汇总分类
查看>>
WPF实现蜘蛛纸牌游戏
查看>>
单例模式
查看>>
工厂方法模式
查看>>