[英]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設計模式的原理。 也許這符合您的實際情況?
但請注意,所有規則都有例外。 如果你的(基類+派生類)代表一個緊耦合和連貫的單元(例如具有兩個子類FastTree
和SmallTree
的Tree
接口,針對不同的目的進行了優化),那么他們可以相互了解,並且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_ptr
或boost::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.