2012-08-06 93 views
12

我想知道爲什麼C++不支持參數中的協方差,比如下面的例子或者是否有辦法實現它?參數中的C++協方差

class base { 
public: 
virtual base* func(base * ptr) { return new base(); } 
}; 

class derived : public base { 
public: 
virtual derived* func(derived * ptr) override { return new derived(); } //not allowed 
}; 
+3

一個更有趣的問題是爲什麼不支持參數的反差。 – 2012-08-06 02:02:30

回答

10

返回類型,因爲從basederived繼承允許的,但功能參數不能正常工作 - 不是所有的base情況下將是一個derived也。在指向base的指針上調用func並且參數不是derived的情況下應該會發生什麼情況?最派生的實現不可調用。

+6

違反利斯科夫替代原則。 – 2012-08-06 00:24:47

+0

是否有解決方法?在Java/C#中,您只需使用一次強制轉換,但在C++中,您的對象將被切片。 – Winter 2017-01-11 17:29:09

+0

@Winter沒有切片,除非你傳值(並且傳值通過多態函數傳遞,這是這裏的問題)。通過指針傳遞(如在問題中)或者引用/ shared_ptr/unique_ptr都可以工作,並且可以像任何其他OO語言一樣不需要任何切片。唯一的問題是使用哪個類型來保證安全性,並且適合類型層次結構,這可以歸結爲dynamic_cast或static_cast之間的選擇,以及嚴格警告用戶不會破壞您正在施加的不成文合約。可能你想重新審視你的設計決定。 – Flexo 2017-01-11 17:41:13