2012-08-27 58 views

回答

1

由於函數原型不同(一個使用ParentClass而另一個使用ChildClass)它們是而不是的功能相同。相反,有ChildClass參數的那個是超載而不是覆蓋Delete函數。

+0

但是,由於參數協方差。它是一個接口,它在Child實現它之前沒有實現,因爲Child具有與ParentClass相同的屬性 - 爲什麼這會成爲一個問題,並且有辦法解決這個問題嗎? – Deukalion

+0

我可以覆蓋父類方法:virtual void Delete()= 0;用void Delete(ChildClass * childClass);? – Deukalion

+0

@Deukalion不,因爲父方法沒有參數,子方法是參數,它們仍然會有所不同。 –

0

C++ 03標準:10.3/2

如果虛擬成員函數vf在類Base和在類Derived被聲明,直接或間接從Base衍生,成員函數vfBase::vf具有相同的名稱和相同的參數列表,因此聲明爲,那麼Derived::vf也是虛擬的,它將覆蓋Base::vf

請注意粗體文本。
派生類函數僅覆蓋基類函數,並且僅當它與基類函數具有相同的簽名時纔有效,但Co-Variant return types除外。由於您的函數Delete()在基類和派生類中不具有相同的簽名,因此派生類函數不會提供基類函數,但您得到的僅僅是Function Hiding

C++ 03標準:3.3.7/1:

的名稱可以由相同的名稱的顯式聲明在嵌套聲明區域或派生類被隱藏。

0

因爲任何被接受爲基類函數的參數的類型也必須可以通過覆蓋該函數來接受。這防止錯誤,例如:

struct BastardClass : ParentClass {} wrong; 
Delete(&wrong); 

,如果調度到任何期望一個ChildClass倍率,會導致它解釋對象作爲錯誤的類型。

(這被稱爲逆變 - 參數由特定類型的覆蓋的功能必須是具體不多比那些被重寫。出於類似的原因,返回類型必須是協變 - 那些通過由特定類型的覆蓋的功能指定必須不下特異性)