禁止更改退貨類型。改變派生類中虛函數的參數是什麼意思?
但是,改變參數意味着什麼?這是否意味着:
虛擬函數被正確地重新定義/覆蓋,因爲它的意圖是。
或
虛擬功能不被重新定義/覆蓋但實際上是在派生類過載。因此,如果虛函數是純的,派生類仍然是抽象的。
是1或2還是其他?
禁止更改退貨類型。改變派生類中虛函數的參數是什麼意思?
但是,改變參數意味着什麼?這是否意味着:
虛擬函數被正確地重新定義/覆蓋,因爲它的意圖是。
或
虛擬功能不被重新定義/覆蓋但實際上是在派生類過載。因此,如果虛函數是純的,派生類仍然是抽象的。
是1或2還是其他?
它被超載。參數是函數簽名的一部分。是的,仍然是抽象的。
「禁止更改退貨類型」。
對於一般情況,這種假設是錯誤的。
「2.虛擬功能不被重新定義/覆蓋但實際上是在派生類過載。其結果是,如果虛擬函數是純粹的,派生類仍然抽象」。
「是1或2還是別的嗎?」
這2.
通過追加/變更參數(一個或多個)改變的函數的簽名/類型將不再匹配由抽象基類提供的純virtual
函數簽名。
所以是的。派生類不提供純粹的virtual
函數聲明的實現,因爲它繼承自基類,因此它仍然是抽象的,是的。
這是爲了通過直覺來確認。 – 2015-04-04 19:46:24
@πάνταῥεῖ:我認爲他的意思是「_my_ gut feeling」。 – 2015-04-04 20:02:20
更改返回類型被禁止
不,協變返回類型是罰款。例如。
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);
我指的是虛擬功能。我不知道協變的意思,但是我在某處讀到基類中的虛函數無法在派生類中更改其返回類型。請在此澄清。 – 2015-04-04 19:57:54
@Grendan:有什麼要澄清的?他說你的說法是錯誤的。無需重複您的錯誤陳述。 :) – 2015-04-04 20:01:59
...除了參數上的頂級cv-qualifiers不是函數簽名的一部分,所以「其他」不包括那些 – 2015-04-04 20:03:16
這將有助於找到這些引號的上下文。 – Brian 2015-04-04 19:42:24
我把報價爲更好的可讀性。這是我腦海中浮現出來的東西。 – 2015-04-04 19:43:46
我的意思是說如果派生類改變基類虛函數的參數而不是覆蓋它,會發生什麼?什麼影響? – 2015-04-04 19:45:45