这两个单词常常被翻译为相同的“重载”,让人混淆,也有说 override 应该被翻译为重写或覆盖。这里有个小提示,因为并不是每个人都上过正规的OO课程,当两个单词都被翻译为“重载”时,它们的读音是不同的:

 

    override:Chong2 Zai3,重新载入

    overload:Zhong4 Zai3,超重装载

 

比如“操作符重载” 应该念为操作符Zhong4载。这里姑且不讨论应该怎样理解"载入"的意思。

 

同名函数根据参数不同而不同,这样我们让一个函数名称具有多种定义,把这种特性描述为“卡车超载”,倒是有几分神似。但是这种特性也很容易使人联想到多态。事实上,维基百科上就把操作符重载的性质描述为一种多态。所以,当提到多态时,你应该知道,多态是一个含义很广的概念。

 

但是override的翻译似乎都不怎么好,”重写“和”覆盖“从词汇上看都显得不那么术语,读的时候就很容易造成不必要的联想。英文 override 显然不是重写 overwrite,也不是覆盖 overlay,它的意思比较像”推翻“,那么为什么不翻译为”推翻“呢?看下面的例子:

 

    ”精灵“类有一个”绘制“的方法。

    “巫婆精灵“继承了”精灵“。

    1. ”巫婆精灵“重写了”绘制方法“。

    2. ”巫婆精灵“覆盖了”绘制方法“。

    3. ”巫婆精灵“推翻了”绘制方法“。

 

比较一下,先看“重写”:”巫婆精灵“重写了”绘制方法“,这不是废话吗?“巫婆精灵”的绘制方法,当然要重写,如果不重写,那岂不是要继承老方法?问题是,你怎样区分这个重写是"override”的重写,还是"non-override"的重写?

 

再看“覆盖”:”巫婆精灵“覆盖了”绘制方法“,好吧,巫婆精灵的“绘制方法”把父类的同名方法给盖住了。是不是有点像,比如说上课时,你在偷偷的看漫画,一旦老师走过来,你就把语文书盖在漫画上。那么,语文书覆盖了漫画:结果是,漫画看不见了!override 的特殊含义是说隐藏原方法使它看不见呢,还是有其它的特指呢?你怎样用“覆盖”来区分 override 和 non-override 的不同呢?你只能说:

 

    虚函数才能被覆盖,非虚函数不能被覆盖。

 

但是为什么呢?请注意这里的覆盖,它必须被理解为术语的“覆盖”才行,但“覆盖”这个单词有它的直观的认知,就是相同的名字被重新定义了。所以,实际上是说:

 

    虚函数才能被“覆盖”,非虚函数不能被“覆盖”。但是所有函数都可以被覆盖。

 

或者:

 

    虚函数才能被“特别覆盖”,非虚函数不能被“特别覆盖”。但是所有函数都可以被普通覆盖。

 

再或者:

 

    虚函数才能被覆盖,非虚函数不能被覆盖。但是所有函数都可以被重写。

 

或者:

 

    虚函数才能被重写,非虚函数不能被重写。但是所有函数都可以被重新自然定义。

 

看了这么多,你现在是否觉得思路逐渐清晰,还是越看越糊涂了?

 

再比较一下:

 

    虚函数才能被推翻,非虚函数不能被推翻。但是所有函数都可以被覆盖,这是显而易见的。

 

并且,可以自然引申开来:

 

    当你覆盖虚函数的时候,虚函数同时被推翻。(overwrite -> override)

 

这样是不是更形象,而且更加符合 override 这个单词的本意?

 

    If the function is non-virtual, nothing can _override_ it. 

    Any member of the derived class with the same name _hides_ it.

    非虚函数不能被推翻。但可以被派生类的同名函数隐匿。

 


如果写成“非虚函数不能被覆盖。但可以被派生类的同名函数隐匿。”这样恐怕难以体会覆盖和隐匿有什么不同了。


 

--

注意:所有函数都可以被覆盖,这可不一定,在 Java 里,final 函数不可覆盖。