2012-10-12 51 views
4

你可以有一個父類共享指針返回類型的函數,然後返回一個新的子類,而不是它是一個共享指針?我不確定共享指針如何在這些情況下工作,它們是否像普通指針一樣行事?這是我的例子:當父類共享指針是返回類型時返回新的基類

BaseEventPtr Actions::getEvent(const std::string& nodeName) 
{ 
    if(asLowerCaseString(nodeName) == "action") 
     return new ActionEvent(&m_interface); 

    return nullptr; 
} 

動作事件是BaseEvent在這種情況下,子類。

乾杯!

+0

有沒有聽說過[工廠模式](http://stackoverflow.com/q/5120768/796036)?也許這會給你一些想法,你真正想要的。 –

+0

是的,我聽說過它,將考慮修改我正在工作的當前系統,乾杯。 –

回答

2

如果BaseEventPtr是一個智能指針,它應該可以。

基本上,當沒有更多引用時,共享指針在實際指針上調用delete。如果基類定義了虛擬析構函數delete將調用正確的子類的析構函數。

例如:

class NonVirtualBase {}; 
class NonVirtualSubclass: public NonVirtualBase {}; 

shared_ptr<NonVirtualBase> ptr(new NonVirtualSubclass()); // NOT OK! 

class VirtualBase 
{ 
    virtual ~VirtualBase() {} 
}; 

class VirtualSubclass: public VirtualBase {}; 

shared_ptr<VirtualBase> ptr(new VirtualSubclass()); // OK 

這適用於正常的(裸)指針,以及。這就是爲什麼作爲一般規則,如果一個類將來可以作爲基類,它應該用一個虛擬析構函數來定義(即使是空的)。

+0

感謝您的幫助,它確實沒有問題。 –