之前在社区里的C++语言论坛问了一个问题,
http://topic.csdn.net/u/20100520/16/5c0e208e-27a0-4ad8-af55-ca6e8913db5a.html
问题就是“派生类为什么不能重载基类的函数?”,下面看一段简单的C++代码:
这里派生类B的对象b,因为重新定义了function,虽然形参不同,但是仍然访问不到其基类A的function方法。也就是说派生类不能重载基类的函数。大家都会觉得这个就是规定,C++代码就是有这样规定的。但是我这个人有时候就愿意“钻钻牛角尖”。原因是我在本科的时候曾经听过一个C++老师这样说过:“C++代码的规则都是有意义的,你们回去编程的时候要想一想,C++代码为什么要这样定义,不这样定义会有什么问题?”这话我很喜欢,因为我觉得一个成熟的语言就是要无懈可击的,它这样规定一定有它的意义。所以我就开始思考如果不这样定义会怎样呢?结果我发现了问题的所在。
问题就出在继承上,大家知道C++代码是可以多继承的,即一个派生类可以从多个基类继承。假设派生类可以重载基类的函数,那么看下如下代码C++会怎样处理呢?
以上代码假设派生类能重载基类的函数,那么就出现了两个function,这就出现了重定义的错误。所以这时C++就要不准同时继承A和B,对,问题就在这里。要么派生类能重载基类的函数,要么派生类不能多继承。这个也就是为什么JAVA的派生类能重载基类的函数,但是JAVA的派生类不能多继承的原因。说到这里,大家应该明白C++派生类为什么不能重载基类的函数了吧?这是因为这样做会与多继承冲突并产生歧义。这样的解释终于可以心服口服了。