2016-08-23 22 views
5

我有一個基類與虛擬函數:什麼原因導致「W1010方法'%s'隱藏基類型'%s'的虛警方法」警告?

TMyBaseClass = class(TObject) 
public 
    ValueOne : integer; 
    procedure MyFunction(AValueOne : integer); virtual; 
end; 

procedure TMyBaseClass.MyFunction(AValueOne : integer); 
begin 
    ValueOne := ValueOne; 
end; 

子類實現具有相同名稱的功能。 這個函數添加一個新的參數並調用它的anchestor的函數。

TMyDerivedClass = class(TMyBaseClass) 
public 
    ValueTwo : integer; 
    procedure MyFunction(AValueOne : integer; AValueTwo : integer); 
end; 

procedure TMyDerivedClass.MyFunction(AValueOne : integer; AValueTwo : integer); 
begin 
    inherited MyFunction(AValueOne); 
    ValueTwo := ValueTwo; 
end; 

在編譯時,示出了以下警告消息:W1010方法

「的MyFunction隱藏了基類型的虛擬方法TMyBaseClass'

我找到了解決該問題閱讀another question,但我想知道是什麼導致此警告。 TMyDerivedClass.MyFunction是否隱藏TMyBaseClass.MyFunction,即使這兩個函數具有不同的參數?如果是這樣,爲什麼?

回答

8

documentation解釋這個問題很清楚:

您已經聲明具有相同名稱作爲基類的虛方法的方法。你的新方法不是一個虛擬方法;它會隱藏對基地同名方法的訪問。

什麼是隱藏的意思是,從派生類,你不再有機會獲得在基類中聲明的虛方法。由於它與派生類中聲明的方法具有相同的名稱,因此不能引用它。後一種方法是從派生類中可見的方法。

如果兩種方法都用overload指令標記,那麼編譯器可以使用它們的參數列表來區分它們。沒有這些,編譯器可以做的就是隱藏基本方法。

閱讀鏈接文檔的其餘部分,以獲取關於潛在解決方案的建議。

+0

感謝您的回答,您解決了我對此的所有疑問。 – ExDev

相關問題