怎样翻译 override 和 overload?

原创 2011年01月19日 20:05:00

 

这两个单词常常被翻译为相同的“重载”,让人混淆,也有说 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 函数不可覆盖。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

overload and override

  • 2011-12-08 17:18
  • 37KB
  • 下载

c++中的覆盖(override)、重载(overload)与隐藏

定义覆盖(override)覆盖(override)指的是子类重定义父类中的虚函数。特征: 分别位于具有继承关系的子类和父类中; 父类中的某个函数带有virtual关键字; 子类中有与之函数名相同、参...

inherited, dynamic ,virtual , override , overload

inherited使用格式inherited XXX(ParamsList);表示使用父类中的名为XXX的方法,ParamList为方法的参数列表;调用时可不加方法名,表示调用父类中同名方法,若父类中...

Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

Overload是重载的意思,Override是覆盖的意思,也就是重写。 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。 重写O...

重载(overload),覆盖(override),隐藏(hide)的区别

重载(overload),覆盖(override),隐藏(hide)。在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的,他们是英语专业的),常常把重载 (over...

java基础的静态导入,自动装箱,增强for循环以及overload 与override的区别

首先说一说java的静态导入 静态导入,就像类中的静态方法,不需对象就能通过类调用,而静态导入,就是相比与普通的导入,可以忽略掉调用类,直接写方法如下列: impo...

java中Overload(重载)和Override(重写、覆盖)

面试题:重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分? 答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运...

覆盖与重载(override/overload) [C#]

1. 方法签名与方法的显式隐藏    以下程序中,子类B与父类A存在签名相同的函数,将产生方法隐藏。由于没有显式使用new修饰符,编译时出现警告。 签名相同简单的讲是指忽略访问控制符、函数返回值、参...

overload与override的区别

override(重写,覆盖) 1、方法名、参数、返回值相同。 2、子类方法不能缩小父类方法的访问权限。 3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。 4、存...
  • T1008
  • T1008
  • 2014-07-11 11:13
  • 229
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)