据我了解,要传递/返回多态对象,您需要使用指针或引用类型来防止切片问题。但是,要从函数返回对象,您不能在堆栈上创建并返回引用,因为本地对象将不再存在。如果您在堆上创建并返回引用/指针 - 调用者必须管理内存 - 不好。
考虑到上述情况,我将如何编写一个返回多态类型的函数?我会使用什么返回机制/类型?
据我了解,要传递/返回多态对象,您需要使用指针或引用类型来防止切片问题。但是,要从函数返回对象,您不能在堆栈上创建并返回引用,因为本地对象将不再存在。如果您在堆上创建并返回引用/指针 - 调用者必须管理内存 - 不好。
考虑到上述情况,我将如何编写一个返回多态类型的函数?我会使用什么返回机制/类型?
您将返回一个负责内存管理并明确所有权的智能指针:
#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
直接调用。请参阅相关问题。