說,如果我有虛擬方法的接口,但其中一個參數是(PARAM =指針親本)如果我後來在子類中實現這個繼承的類的實現的方法在子類(PARAM =指針到子)
void Delete(ChildClass *childClass)
{
};
...爲什麼這不作爲實現工作?
說,如果我有虛擬方法的接口,但其中一個參數是(PARAM =指針親本)如果我後來在子類中實現這個繼承的類的實現的方法在子類(PARAM =指針到子)
void Delete(ChildClass *childClass)
{
};
...爲什麼這不作爲實現工作?
由於函數原型不同(一個使用ParentClass
而另一個使用ChildClass
)它們是而不是的功能相同。相反,有ChildClass
參數的那個是超載而不是覆蓋Delete
函數。
C++ 03標準:10.3/2
如果虛擬成員函數
vf
在類Base
和在類Derived
被聲明,直接或間接從Base
衍生,成員函數vf
與Base::vf
具有相同的名稱和相同的參數列表,因此聲明爲,那麼Derived::vf
也是虛擬的,它將覆蓋Base::vf
。
請注意粗體文本。
派生類函數僅覆蓋基類函數,並且僅當它與基類函數具有相同的簽名時纔有效,但Co-Variant return types除外。由於您的函數Delete()
在基類和派生類中不具有相同的簽名,因此派生類函數不會提供基類函數,但您得到的僅僅是Function Hiding。
C++ 03標準:3.3.7/1:
的名稱可以由相同的名稱的顯式聲明在嵌套聲明區域或派生類被隱藏。
因爲任何被接受爲基類函數的參數的類型也必須可以通過覆蓋該函數來接受。這防止錯誤,例如:
struct BastardClass : ParentClass {} wrong;
Delete(&wrong);
,如果調度到任何期望一個ChildClass
倍率,會導致它解釋對象作爲錯誤的類型。
(這被稱爲逆變 - 參數由更特定類型的覆蓋的功能必須是具體不多比那些被重寫。出於類似的原因,返回類型必須是協變 - 那些通過由更特定類型的覆蓋的功能指定必須不下特異性)
C++不支持虛擬函數 –