2014-03-03 143 views
3

它是否爲O.K.設計如果我從基類成員函數返回Derived類的實例(使用新的Derived()創建)?從基類成員函數返回派生類的實例

此外,這涉及到需要轉發聲明Derived類,並也使派生類構造函數公開。

代碼示例: -

Class Base 
{ 
public: 
    Base() {} 
    Derived* get_new_derived(int X) 
    { 
    Derived *der = new Derived(X); 
    return der; 
    } 
} 

Class Derived : public Base 
{ 
private: 
    int _X; 
protected: 
    Derived(int X) { _X = X; } 
public: 
    Derived* get_new_derived(int X) 
    { 
    Derived *der = new Derived(X); 
    return der; 
    } 
} 

我還有一個派生類(說Derived1)。現在讓我們假設: -

Usage1:

Derived1* der1 = new Derived1(); 
Derived * der = der1->get_new_derived(10); 

Usage2:

Derived1* der1 = new Derived1(); 
Base* bs = der1; 
Derived * der = bs->get_new_derived(10); 
+0

你能成爲一個更具體一點(理想情況下表現出預期的界面和使用量小的代碼示例)?例如,你的意思是返回一個新的Derived()類型爲'Base *'還是'Derived *'?在現代C++中,你絕對不應該使用擁有的原始指針 - 使用一個像[[std :: unique_ptr]](http://en.cppreference.com/w/cpp/memory/unique_ptr)或['boost :: shared_ptr'](http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/shared_ptr.htm)。 – Angew

+0

這是目前的形式無法迴避的。你有工作代碼,你問這是否是一個好的解決方案,但我們不知道這個激勵問題。 – Potatoswatter

+1

看看這個線程中的註釋http:// stackoverflow。com/questions/15611959 /使用返回類型作爲指針派生類 – manlio

回答

3

在一般情況下,這通常表示設計不好 - 基類通常不應該知道/關心其派生類。

請注意,您可以返回一個指向Derived的指針,其類型爲Base* - 這就是Factory Method設計模式的原理。也許這符合你的實際情況?

但請注意,所有規則都有例外。如果您的(基類+派生類)表示一個緊密耦合且相關的單元(例如Tree接口和兩個子類FastTreeSmallTree,針對不同目的進行了優化),那麼它們可以相互知道並且可以定義爲Tree諸如:

std::unique_ptr<SmallTree> Tree::createSmallCopy() const 
{ 
    return { new SmallTree(/*args*/) }; 
} 

std::unique_ptr<FastTree> Tree::createFastCopy() const 
{ 
    return { new FastTree(/*args*/) }; 
} 

所以它取決於你的實際使用情況。我通常會對這種設計保持警惕,但它有其用途。


作爲一個方面說明,在現代C++,你不應該使用一個擁有原始指針 - 使用智能指針像std::unique_ptrboost::shared_ptr

+0

感謝您的信息。另外我想問一下,如果它有一個派生類的派生類朋友(都來自同一個基類)?我這樣問是因爲,我只想要一種方法來實例化派生類,並且向Derived1添加一個虛擬函數意味着我必須使Derived ctor公開,這會破壞我的目的。那麼可以添加Derived作爲Derived1的朋友嗎? –

+0

@VineetDeoraj同樣的推理適用。如果他們形成一個緊密耦合和一致的單位,使用一切必要的手段來實現你想要的功能。在一般情況下,非常謹慎地使用'朋友'。 – Angew

1

是的,你可以做到這一點。問題是你是否應該。

你不應該這樣做,因爲它暗示了Base Know Derived,這是不正確的面向對象的設計。依賴應該是一種方式 - 派生知道基地,而不是相反。

相關問題