2012-07-04 106 views
1

有什麼方法可以在新派生類實例時向基類提供構造函數參數? (也就是說,當基類構造函數具有這些參數的默認值時)在創建派生類實例時提供基類構造函數參數

例如,

class Base 
{ 
public: 
Base::Base(string name = "") 
: m_name(name) {}; 

private 
string m_name; 
}; 

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

然後,我需要做這樣的事情:

void main() 
{ 
Base* instance = new Derived("Jeff"); 
}; 

這顯然是行不通的。有沒有辦法給新的派生實例提供一個構造函數參數給它的基礎,而不必在派生類構造函數中提供該參數。

回答

2

有沒有辦法給新的派生實例提供一個構造函數參數給它的基礎,而不必在派生類構造函數中提供該參數。

你的派生類的構造函數需要採取的論點,並明確將它們傳遞到基類的構造函數。

class Derived : public Base 
{ 
public: 
Derived::Derived(string name) : Base(name) {}; 
}; 

無論您是否使用new都是如此。

+0

我希望有一種方法可以避免必須在派生構造函數中提供參數。這是唯一的方法嗎? –

+0

@MarcusTomlinson:非常漂亮。很顯然,我提出了一些變體,但它們都涉及在其初始化列表中明確調用「Base」構造函數的Derived構造函數。但這是有道理的; 「派生」源自「基礎」的事實是施工時的實施細節;這個事實本質上是封裝的。 –

+0

該死的......爲答案拍攝! –

1

如果您想將不同名稱放入基類中,則無法執行此操作。然而不同的名字是不是一個標準,你可以通過使用常量文本爲做到這一點:

class Base 
{ 
public: 
Base::Base(string name = "") 
: m_name(name) {}; 

private 
string m_name; 
}; 

class Derived : public Base 
{ 
public: 
Derived::Derived() : Base ("Jeff") {}; 
Derived::Derived(string &name) : Base (name) {}; 
}; 

或通過默認值派生類的構造函數。

class Derived : public Base 
    { 
    public: 
    Derived::Derived(string name = "Jeff") : Base (name) {}; 
    }; 
相關問題