在没有动态内存分配的情况下,C++中是否有一种机制可以从基类指针生成派生类的完整副本?

mer*_*011 4 c++ pointers auto c++11

请考虑以下示例,其中在取消引用基指针期间发生对象切片.

#include <stdio.h>

class Base {
  public:
    virtual void hello() {
        printf("hello world from base\n");
    }
};
class Derived : public Base{
  public:
    virtual void hello() {
        printf("hello world from derived\n");
    }
};

int main(){
    Base * ptrToDerived = new Derived;
    auto d = *ptrToDerived;
    d.hello();
}
Run Code Online (Sandbox Code Playgroud)

我希望变量d保存类型的对象Derived而不是类型的对象Base,没有动态内存分配,也没有显式强制转换.

我已经看过这个问题了,但是答案中提出的解决方案需要动态内存分配,因为它返回一个指向新对象的指针,而不是新对象的值.

这在C++ 11中是否可行?

Bri*_*ian 6

不,这是不可能的,因为如果d没有动态存储持续时间,那么它必须具有静态,线程或自动存储持续时间,并且在所有这些情况下,对象的类型在编译时是已知的.在您的情况下,您希望在运行时确定对象的类型,因为ptrToDerived可能指向Base对象或Derived对象或从其他类派生的对象Base.

如果您关注的是生命周期和内存泄漏,那么只需clone返回a std::unique_ptr<Base>而不是Base*.