你有反差。
返回類型隱式轉換爲基本類型(逆變)。但是參數隱式轉換爲派生類型(協方差),並且指向成員的類類型可以作爲參數。要看到這一點,讓我們應用Liskov可替代性原則:
Base*
的合同是:「我會給你一個基地」(當你對我使用*
運營商時)。 Derived*
合同是「我會給你一個派生的,這也是一個基地」。
顯然,Derived*
可以用來代替Base*
。因此存在從Derived*
到Base*
的隱式轉換。
但是考慮指向成員的指針。
的int Base::*
的合同是:「給我一個基地,我會還給你一個int」(A派生是基礎,所以這些都是OK太) 的int Derived::*
的合同是:「給我一個推導我會給你回一個int」(但不是任何舊Base
會做,它必須是一個Derived
)
假設你有一個Base
這不是一個Derived
。當解引用int Base::*
時它會很好地工作,但不能與int Derived*
一起使用)。
但是,如果您有
Derived
,則可以使用它取消引用
int Base::*
和
int Derived::*
。因此,有從
int Base::*
到
int Derived::*
哎呀隱式轉換,我沒有你所說的話,並分析了該成員所屬的類型。
雖然LSP仍然有效。我同意轉換應該是合法的,至少根據類型安全。合同是「給我一個Foo
,我會給你一個Derived
」,這顯然你可以用它來從Foo
到Base
,通過組成一個隱式轉換。所以它很安全。 DeadMG可能在正確的軌道上指出了與基本子對象的關係位置的潛在複雜性,特別是在虛擬繼承中。但是指針成員在解除引用運算符的LHS中處理這些問題,所以他們也可以得出結果。
最終答案可能只是標準並不要求轉換是合法的。
「通常允許從基礎*轉換爲派生*」 我認爲你有這個落後。 – 2010-12-09 22:33:03
好的。固定。 – Chris 2010-12-09 22:38:59
見http://stackoverflow.com/questions/4295117/pointer-to-member-conversion – icecrime 2010-12-09 22:57:59