C++ C++;生成多态对象的函数的返回类型?

C++ C++;生成多态对象的函数的返回类型?,c++,pointers,memory-management,polymorphism,virtual-functions,C++,Pointers,Memory Management,Polymorphism,Virtual Functions,据我所知,要传递/返回多态对象,需要使用指针或引用类型来防止切片问题。但是,要从函数返回对象,您不能在堆栈上创建并返回引用,因为本地对象将不再存在。如果在堆上创建并返回引用/指针-调用者必须管理内存-不好 考虑到上述情况,我将如何编写一个返回多态类型的函数?我将使用什么返回机制/类型?您将返回一个智能指针,负责内存管理并明确所有权: #include <memory> struct IFoo { virtual ~IFoo() {} }; struct Foo1 : IFoo

据我所知,要传递/返回多态对象,需要使用指针或引用类型来防止切片问题。但是,要从函数返回对象,您不能在堆栈上创建并返回引用,因为本地对象将不再存在。如果在堆上创建并返回引用/指针-调用者必须管理内存-不好


考虑到上述情况,我将如何编写一个返回多态类型的函数?我将使用什么返回机制/类型?

您将返回一个智能指针,负责内存管理并明确所有权:

#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()}; 
}
#包括
结构IFoo
{
虚拟~IFoo(){}
};
结构Foo1:IFoo{};
结构Foo2:IFoo{};
std::unique_ptr make_foo()
{ 
返回std::unique_ptr{new Foo1()};
}

请注意,C++14具有
std::make_unique
,这允许您执行上述操作,而无需直接调用
new
。请参阅。

并且IFoo将是基本类型?@user997112是的,正确。我将添加更多的代码来说明这一点。@KonradRudolph相关的
unique\u ptr
构造函数的显式不就是非法的吗?G++4.8和Clang3.2.1不喜欢它。@juanchopanza啊,该死,我以为在返回语句中只有初始化器列表可以调用显式构造函数。可怜。毕竟,我们没有使用
returnnewfoo1在这里,我们使用括号,这样比较安全。