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
指向的动态类型,因为它可能要到运行时才能确定。
考虑以下示例,其中在取消引用基指针期间发生对象切片。
#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
指向的动态类型,因为它可能要到运行时才能确定。