2011-04-03 287 views
6

我試圖理解,但仍然不確定。如果基類中有構造函數,派生類將始終調用它?我知道它們可以覆蓋它(這裏不是正確的術語,我知道 - 我的意思是將代碼添加到它們的構造函數中),但是我假設如果構造函數是在基類中定義的,派生類將始終調用它。真的嗎?構造函數繼承

回答

6

是的,如果有一個無參數的構造函數,它總是會被調用。如果有一個以上的構造函數,你可以選擇一個與base關鍵字來調用:

class Parent { 
    public Parent() {} 
    public Parent(int x) {} 
} 

class Child : Parent { 
    public Child(int x) : base(x) { 
    } 
} 

如果沒有無參數的構造函數,你會被迫做到這一點:

class Parent { 
    public Parent(int x) {} 
} 

class Child : Parent { 
    // This will not compile without "base(x)" 
    public Child(int x) : base(x) { 
    } 
} 
+0

不知道我明白了。在第一個例子中,有Child(int x):base(x),所以我猜都會被調用? – Miria 2011-04-03 15:35:05

+0

@Miria:是的。沒有辦法調用* some * base構造函數(例如在第二個例子中,編譯器不會讓你移除'base(x)');使用'base'只是允許你選擇*哪一個*將被調用,以及什麼參數。 – Jon 2011-04-03 15:42:50

2

如果在基類中只有一個無參數構造函數,那麼子類構造函數將始終首先調用它。另一方面,如果在基類中定義了其他構造函數,那麼子類將有一個選項調用哪個基構造函數。