2015-04-04 63 views
3

禁止更改退貨類型。改變派生類中虛函數的參數是什麼意思?

但是,改變參數意味着什麼?這是否意味着:

  1. 虛擬函數被正確地重新定義/覆蓋,因爲它的意圖是。

  2. 虛擬功能不被重新定義/覆蓋但實際上是在派生類過載。因此,如果虛函數是純的,派生類仍然是抽象的。

是1或2還是其他?

+0

這將有助於找到這些引號的上下文。 – Brian 2015-04-04 19:42:24

+0

我把報價爲更好的可讀性。這是我腦海中浮現出來的東西。 – 2015-04-04 19:43:46

+0

我的意思是說如果派生類改變基類虛函數的參數而不是覆蓋它,會發生什麼?什麼影響? – 2015-04-04 19:45:45

回答

0

它被超載。參數是函數簽名的一部分。是的,仍然是抽象的。

1

「禁止更改退貨類型」。

對於一般情況,這種假設是錯誤的。

「2.虛擬功能不被重新定義/覆蓋但實際上是在派生類過載。其結果是,如果虛擬函數是純粹的,派生類仍然抽象」。

「是1或2還是別的嗎?」

這2.

通過追加/變更參數(一個或多個)改變的函數的簽名/類型將不再匹配由抽象基類提供的純virtual函數簽名。

所以是的。派生類不提供純粹的virtual函數聲明的實現,因爲它繼承自基類,因此它仍然是抽象的,是的。

+0

這是爲了通過直覺來確認。 – 2015-04-04 19:46:24

+0

@πάνταῥεῖ:我認爲他的意思是「_my_ gut feeling」。 – 2015-04-04 20:02:20

3

更改返回類型被禁止

不,協變返回類型是罰款。例如。

struct A {}; 
struct B: public A {}; 
struct X { 
    virtual A& foo() { return a; } 
    A a; 
}; 
struct Y: public X { 
    B& foo() override { return b; } 
    B b; 
}; 
int main() { 
    return sizeof(Y); 
} 

其他任何變動原型,包括參數列表,確實會導致過載,而不是替代。您可以使用「覆蓋」說明符輕鬆驗證此內容。

正如Ben Voigt指出的那樣,這裏的「參數列表」表示無論您聲明減去任何頂級cv資格。也就是說,這兩種功能被認爲具有相同的類型:

void foo(int, const char *); 
void bar(const int, const char * const); 
+0

我指的是虛擬功能。我不知道協變的意思,但是我在某處讀到基類中的虛函數無法在派生類中更改其返回類型。請在此澄清。 – 2015-04-04 19:57:54

+0

@Grendan:有什麼要澄清的?他說你的說法是錯誤的。無需重複您的錯誤陳述。 :) – 2015-04-04 20:01:59

+0

...除了參數上的頂級cv-qualifiers不是函數簽名的一部分,所以「其他」不包括那些 – 2015-04-04 20:03:16

相關問題