Covariant return type
class Shape {
public:
virtual double area() const = 0;
};
class Circle : public Shape {
public:
float area() const; // error! different return type
};
int
main() {
}
在繼承關係中,子類覆蓋父類的虛擬函式的時候,必須連返回值型別也完全相同。所以上面這個程式編譯是編不過的:
main.cpp:9: error: conflicting return type specified for `virtual float Circle::area() const'
main.cpp:5: error: overriding `virtual double Shape::area() const'
但是這個限制在所謂的“Covariant return type”的情況下可以被放鬆。如果基類的一個虛擬函式返回值型別是B*,那麼其派生類中覆蓋這個函式的時候,返回值型別可以是D*,其中D是任何以public方式繼承自B的派生類(也就是說D is-a B)。如果基類的虛擬函式返回B&,派生類覆蓋這個函式的時候也可以返回D&。
例如這段程式編譯就沒有問題:
class Shape {
public:
// virtual double area() const = 0;
virtual Shape* clone() const = 0;
};
class Circle : public Shape {
public:
// float area() const; // error! different return type
virtual Circle* clone() const;
};
int
main() {
}
當程式通過指向基類(介面)的指標操縱不同的派生類(實體類)的物件時,派生類方法返回的D*/D&型別的值,可以被自動轉換為B*/B&型別。
=================
看下面的例子。要點:返回值(A*,B*)涉及到的類,和虛擬函式所在的類(C和D),可以分屬於兩個完全不同的繼承體系。
class A { };
class B: public A { };
class C {
public:
virtual A* getA() const = 0;
};
class D: public C {
public:
B* getA() const;
};
這段程式編譯沒有錯誤。
注意:
需要包含繼承類標頭檔案,光是型別宣告是不行的。
相關文章
- C++基礎::語法特性::函式重寫(override)與協變返回型別(covariant return type)C++函式IDE型別
- MyBatis提示getFundBonus attempted to return null from a method with a primitive return type (double)MyBatisNullMIT
- 精讀《Get return type, Omit, ReadOnly...》MIT
- C# return dynamic/anonymous type value as function resultC#Function
- 從C++的Return Value Optimization (RVO)到C#的value type (轉)C++C#
- js中return、return true、return false的區別JSFalse
- return
- [譯]await VS return VS return awaitAI
- await、return 和 return await 的陷阱AI
- SAP WM中階儲存型別裡的Full stk rmvl 欄位和Return Storage type欄位型別
- JavaScript return falseJavaScriptFalse
- js跳出迴圈的方法區別( break, continue, return ) 及 $.each 的(return true 和 return false)...JSFalse
- JavaScript return 語句JavaScript
- C語言: returnC語言
- Let's call it a "return"
- 'return await promise' 與 'return promise' 這細微的區別AIPromise
- variable: Type 與 Type variable
- cannot convert (type interface {}) to type int: need type assertion
- ios 修改鍵盤returniOS
- JavaScript return false的作用JavaScriptFalse
- java exception and finally returnJavaException
- Value Type vs Reference Type in SwiftSwift
- finally語句在return執行之後,return返回之前執行
- SpringMVC中@RequestMapping註解中的return “redirect:/“;跟return““的用法。SpringMVCAPP
- python中return的用法Python
- oracle的exit、return、continueOracle
- break,continue,return區別
- preventDefault()與return false區別False
- return false影響事件冒泡False事件
- exit和return的區別
- 簡談Java中的returnJava
- Informix Return Codes for OnBarORM
- sql%notfound、sql%rowcount和returnSQL
- java 的 return 是指標Java指標
- Type in Chakra
- 解密機器人大模型RFM-1:Covariant創始人陳曦專訪解密機器人大模型
- HITSC_4_Data Type and Type Checking
- Model類的一個return作用