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

Is there a mechanism in C++ to make a full copy of a derived class from a base class pointer without dynamic memory allocation?

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

#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();
}

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

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

这在 C++11 中可行吗?

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

如果您关心的是生命周期和内存泄漏,只需 clone return 一个 std::unique_ptr<Base> 而不是 Base*

我猜你的意思是你想让 auto 推导出 D

然而这是不可能的:所有类型都必须在编译时已知。想象一下,如果代码是:

Base *b = some_func();
auto d = *b;

编译器无法知道 b 指向的动态类型,因为它可能要到运行时才能确定。