據我所知,要傳遞/返回多態對象,您需要使用指針或引用類型來防止切片問題。但是,要從函數返回對象,您不能在堆棧上創建並返回引用,因爲本地對象不再存在。如果你在堆上創建並返回引用/指針 - 調用者必須管理內存 - 不好。函數產生多態對象的C++返回類型?
考慮到上述情況,我將如何編寫一個返回多態類型的函數?我會使用什麼樣的返回機制/類型?
據我所知,要傳遞/返回多態對象,您需要使用指針或引用類型來防止切片問題。但是,要從函數返回對象,您不能在堆棧上創建並返回引用,因爲本地對象不再存在。如果你在堆上創建並返回引用/指針 - 調用者必須管理內存 - 不好。函數產生多態對象的C++返回類型?
考慮到上述情況,我將如何編寫一個返回多態類型的函數?我會使用什麼樣的返回機制/類型?
你會返回一個智能指針負責內存管理,使所有權明確:
#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。
和IFoo將是基礎類型? – user997112
@ user997112是的,正確的。我會添加一些更多的代碼來說明這一點。 – juanchopanza
@KonradRudolph顯式相關的'unique_ptr'構造函數是否違法? G ++ 4.8和clang 3.2.1不喜歡它。 – juanchopanza
智能指針? –