2

據我所知,要傳遞/返回多態對象,您需要使用指針或引用類型來防止切片問題。但是,要從函數返回對象,您不能在堆棧上創建並返回引用,因爲本地對象不再存在。如果你在堆上創建並返回引用/指針 - 調用者必須管理內存 - 不好。函數產生多態對象的C++返回類型?

考慮到上述情況,我將如何編寫一個返回多態類型的函數?我會使用什麼樣的返回機制/類型?

+0

智能指針? –

回答

3

你會返回一個智能指針負責內存管理,使所有權明確:

#include <memory> 

struct IFoo 
{ 
    virtual ~IFoo() {} 
}; 
struct Foo1 : IFoo {}; 
struct Foo2 : IFoo {}; 

std::unique_ptr<IFoo> make_foo() 
{ 
    return std::unique_ptr<IFoo>{new Foo1()}; 
} 

需要注意的是C++ 14 std::make_unique,它允許你做以上,而無需調用直接使用new。見related question

+0

和IFoo將是基礎類型? – user997112

+1

@ user997112是的,正確的。我會添加一些更多的代碼來說明這一點。 – juanchopanza

+0

@KonradRudolph顯式相關的'unique_ptr'構造函數是否違法? G ++ 4.8和clang 3.2.1不喜歡它。 – juanchopanza