多态性是否适用于值?或者通过(base-)value返回时使用派生类的move构造函数

Rom*_*Coo 1 c++ virtual factory move

我建立某种工厂方法返回一个DerivedClassBaseClass下列方式:

BaseClass Factory() 
{
    return DerivedClass();
}
Run Code Online (Sandbox Code Playgroud)

是的,BaseClass当我调用该方法时,将使用的move构造函数:

BaseClass object = Factory();
Run Code Online (Sandbox Code Playgroud)

由于我无法制作的move构造函数BaseClass virtual,是否有其他方法可以强制采用的move构造函数DerivedClass

Edit1:其他信息-我已经考虑过指针。但问题是,我想将工厂函数导出到DLL中,并且希望对用户来说尽可能地容易。标准指针可能会导致内存泄漏,另一方面,并​​不是每个人都对智能指针熟悉。

Edit2:据我了解,真正的问题是:多态性是否也可以按值返回?
答案是否定的。

Mir*_*rko 5

我想你不会:

BaseClass Factory() 
Run Code Online (Sandbox Code Playgroud)

反而

// You'll need to delete
BaseClass* Factory() {
    return new Derived();
}

// You will not need to delete
unique_ptr<BaseClass> Factory() {
    // return new Derived();
    // As the comments point out: prefer use of make_unique
    return std::make_unique<Derived>();
}
Run Code Online (Sandbox Code Playgroud)

否则,您将切成薄片

多态仅在指针和引用中起作用

  • 我想将“ std :: make_unique”设为答案中的默认值。没有任何缺点。 (2认同)