2011-01-28 75 views
6

我剛剛發現C++/CLI在標準C++上有一個不存在的關鍵字(AFAIK):override顯式覆蓋虛函數

我對C++/CLI瞭解不多,因此,有人可以解釋其中包含哪些用途,以及它是否可以添加到C++中?

+0

你沒有說你在想什麼的關鍵字是。它是「明確的」嗎?如果是這樣,它是在標準的C++。 – 2011-01-28 19:45:35

+3

@West Hardaker其實我說過。這是「覆蓋」關鍵字。 – kunigami 2011-01-28 19:47:30

回答

12

override是Microsoft特有的關鍵字擴展,可用於C++/CLI和Visual C++實現。它類似於Java中的@Override註釋或C#中的override,並且提供更好的編譯時檢查,以防您不覆蓋您的意圖。

從第一鏈路:

倍率指示管理類型的成員必須重寫基類或鹼接口構件。如果沒有成員可以重寫,編譯器會產生一個錯誤。

覆蓋在編譯原生目標時(無/ clr)也是有效的。請參閱覆蓋說明符和本機編譯以獲取更多信息。

override是一個與上下文相關的關鍵字。有關更多信息,請參閱上下文相關關鍵字。

從C++ 11標準開始,override說明符現在是標準化關鍵字。支持仍然有限,按照此page from Apache StdCxx,GCC 4.7+,Intel C++ 12.0+和Visual C++ 2012(支持Visual C++ 2005中的預標準化)支持override

0

here

如果你標記屬性或在 的方法與virtual 關鍵字父類,從 派生一個類它的時候,你可以忽略的方法或 財產,而不是執行它。但是,如果您決定實施 或方法 ,則必須指明您 正在提供 屬性或方法的新版本。提供屬性或方法的新版本 是被稱爲覆蓋它的 。

當重寫一個屬性或方法 ,您必須通過 表明該寫override關鍵字的 權。

現在,按照link看到一些例子。

+0

這解釋了override關鍵字的機制。它沒有解釋爲什麼它被引入。 – 2011-01-28 20:07:08

1

它可以幫助編譯器抓住你的錯誤有兩種方式:

  1. 如果你聲明一個函數在您的類override,但基類不具有的功能,那麼編譯器可以告訴你,你並不是在壓倒你認爲你是什麼。如果override不可用,那麼編譯器將無法識別您的錯誤 - 它只會假定您打算引入一個新函數。

  2. 如果你在你的子類(沒有override)中有一個函數,然後你在基類中聲明瞭與虛函數相同的函數,編譯器會告訴你,你在基類中的改變影響了在後代的原始聲明。後代將需要使用override,否則您需要更改其中一個功能的簽名。

此功能已被添加到C++ 0x。

0

C++/CLI中的override關鍵字來自.Net,而不是C++本身的一部分。由於覆蓋已經被解釋,您需要知道替代方案。如果你不「覆蓋」它,你可能想要使它成爲「新」。通過使其成爲「新」,您不會覆蓋子級中的父類成員,而是會創建一個具有相同名稱的新成員。當您使用基類指針並將其指向派生類對象時,新的覆蓋關鍵字只有不同。

所以,如果你使用一個基類指針和指向一個派生類對象:

If you call an "override"n member: 
     the derived class member is called 
if you call the "new"ed member: 
     the base class member is called.