2012-11-11 122 views
0

創建一個繼承自另一個類的類時,是否應該在派生類創建時調用基類的構造函數?Delphi XE2 - 繼承類不調用基類的構造函數...?

Type 
    TBase = Class 
    constructor xMain; 
    End; 
    TDerived = Class(TBase) 
    constructor xMain; 
    End; 

constructor TBase.xMain; 
begin 
    MessageBox(0,'TBase','TBase',0); 
end; 

constructor TDerived.xMain; 
begin 
    MessageBox(0,'TDerived','TDerived',0); 
end; 


Var 
    xTClass:TDerived; 
begin 
    xTClass := TDerived.xMain; 
end. 

我認爲這應該導致MessageBox顯示「TBase」,然後「TDerived」。然而,事實並非如此。當上面的代碼運行時,它只會導致一個MessageBox顯示「TDerived」。

+0

您應該爲構造函數創建即使語言本身並沒有強迫你這樣做。 –

回答

9
constructor TDerived.xMain; 
begin 
    inherited; 
    MessageBox(0,'TDerived','TDerived',0); 
end; 
+0

那真是令人尷尬。謝謝。它會讓我接受幾分鐘的時間。 –

6

add在TDerived.xMain中繼承;否則來自祖先的代碼將不會被調用;

begin 
    inherited;//call the ancestor TBase.xMain 
    MessageBox(0,'TDerived','TDerived',0); 
end; 

而且這個問題將有助於你理解繼承保留字:

Delphi: How to call inherited inherited ancestor on a virtual method?

另一個很好的資源是http://www.delphibasics.co.uk/RTL.asp?Name=Inherited

+0

您也可能需要/需要爲重寫的方法調用繼承 - 如果您想執行祖先方法功能並添加到它。 – Toby