2011-01-19 248 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這樣的事情++,如一個函數的重新定義總是會在編譯時導致錯誤。至多,我可以想象彎曲函數指針,或(重新)定義回調鉤子。