2014-03-03 147 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,这是不正确的面向对象的设计。依赖应该是一种方式 - 派生知道基地,而不是相反。

相关问题