簡體   English   中英

從基類成員函數返回派生類的實例

[英]returning instance of derived class from base class member function

如果我從Base類成員函數(使用new Derived()創建)返回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)。 現在讓我們說: -

用法1:

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

用法2:

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

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

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

但請注意,所有規則都有例外。 如果你的(基類+派生類)代表一個緊耦合和連貫的單元(例如具有兩個子類FastTreeSmallTreeTree接口,針對不同的目的進行了優化),那么他們可以相互了解,並且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這樣的智能指針。

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

你不應該這樣做,因為它暗示Base know Derived,這不是適當的面向對象設計。 依賴關系應該是一種方式 - 派生知道Base而不是相反。

這個怎么樣?

// The Curiously Recurring Template Pattern (CRTP)
template<class Derived>
class Base
{
  // methods within Base can use template to access members of Derived
};
class Derived : public Base<Derived>
{
  // ...
};

http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM