2013-02-13 75 views
2

我有以下的情況(以下僅用於說明):基類構造

class Base() 
{ 
public: 
    Base(int); 
}; 

class Derived : public Base 
{ 
public: 
    Derived(int, int, bool); 
}; 

我想初始化取決於布爾標誌在派生構造的基類。什麼(如果有的話)是這樣做的正確的方式..

我可以做(但基地做過評估被初始化):

Derived::Derived(int _x, int _y, bool _z) : Base(_z?_x:_y) {} 

或(但這可能無法正常工作正確)

Derived::Derived(int _x, int _y, bool _z) 
{ 
    if(_z) 
     ::Base(_x); 
    else 
     ::Base(_y); 
} 

如果這樣做,那麼我可能與添加額外的構造函數來Derived脫身的不正確的方法。

+2

第一個解決方案是正確的(使用三元運算符)。如果你有一個更復雜的初始化來計算Base參數的值,你可以使用一個(free或not)函數調用('Derived :: Derived(int _x,int _y,bool _z):Base(compute_value()) {}') – utnapistim 2013-02-13 10:44:19

+0

'class Base()'是錯誤的,請移除parens。你提出的第一個提議是好的,評估將在調用'Base()'構造函數之前完成。 – 2013-02-13 10:47:14

+1

第二個,在'if'的每個分支中,創建一個'Base'類型的臨時對象並立即銷燬它。 – 2013-02-13 13:33:53

回答

2

你的第一個選擇是正確的:使用初始化列表。

第二個選擇不起作用。

3
Derived::Derived(int _x, int _y, bool _z) : Base(_z?_x:_y) {} 

是正確的方法。 您只能通過參數調用基礎構造函數member initializers list

2

第一個選擇是唯一可以工作的替代方案。派生類的構造函數將在基類的構造函數之後調用,因此第二個選項無效。

當然,問題是這是否是「正確」的事情。因爲它可能是你應該有兩個派生類,而不是一個。我並不是說你在做什麼是錯誤的,它只是需要記住的一點。