2011-01-19 250 views
12

我知道什么覆盖是在C++中。但是,是否覆盖?如果是这样,这是什么意思?C++覆盖...覆盖?

谢谢。

+0

我从来没有听说过任何与C++有关的术语“覆盖”。 – 2011-01-19 17:26:01

+3

“覆盖”一词的来源可能是从德语到英语的不好翻译。德语的技术术语“重写”是“überschreiben”,其实际上(!)翻译回英文为“重写”。那么你可能会说德语吗? – nabulke 2011-01-19 18:14:43

回答

14

在C++术语来说,你有首要(与在一个类层次结构的虚拟方法)和超载(与具有相同名称但考虑不同参数的函数)。您还有隐藏的名称(通过在嵌套声明区域或范围中显式声明相同的名称)。

C++标准不使用术语“覆盖”,除非在其规范的英语形式中(即用一个新值替换一个值,如覆盖以前值x的赋值x = 10)。

7

您可以覆盖变量,例如int a = 0; a = 42;和文件(打开现有文件进行写入 - 如果您有权限,它将覆盖现有文件内容),如果这就是您的意思。这与压倒一切没有多大关系。你是否想过重载?

5

我熟悉的通常区别是覆盖和重载。 虚拟功能被覆盖。当有一个名称相同但签名不同的版本时,函数会被重载(这存在于很多语言中)。在C++中,你也可以重载操作符。 AFAIK,覆盖是一个不相关的概念(覆盖变量,文件,缓冲区等),并且并不特定于C++甚至是OOP语言。

2

覆盖在OOP中是“正常的事情”:派生类为某些东西提供了一个不同的(即更专门的)实现,覆盖了基类,例如。 apple::foo()覆盖fruit::foo()如果苹果是从水果派生的类。 (不要被过载错误使用不同的参数签名,这导致完全不同的功能)。

覆盖我知道完全用另一个定义替换。不是在具体的水平上,而是在程序的其余部分。这有时会被使用的JavaScript,如果一个大的框架,有一些特殊的问题,而你不想撕开的大文件:

<script type="text/javascript" 
    src="some super big framework, often in one big file"> 
<script type="text/javascript"> 
    Ext.ux.window.createWin = function() { 
    // completely OVERWRITE the implementation 
     (often to 'hotfix' a particular bug) 
    } 
</script> 

不过:我不知道的任何C这样的事情++,如一个函数的重新定义总是会在编译时导致错误。至多,我可以想象弯曲函数指针,或(重新)定义回调钩子。