C++ C+中是否存在一种机制+;要从基类指针生成派生类的完整副本而不进行动态内存分配?
考虑以下示例,其中对象切片发生在基本指针的解引用期间C++ C+中是否存在一种机制+;要从基类指针生成派生类的完整副本而不进行动态内存分配?,c++,pointers,c++11,auto,C++,Pointers,C++11,Auto,考虑以下示例,其中对象切片发生在基本指针的解引用期间 #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 f
#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();
}
#包括
阶级基础{
公众:
虚拟void hello(){
printf(“来自基地的hello world\n”);
}
};
派生类:公共基{
公众:
虚拟void hello(){
printf(“衍生的hello world\n”);
}
};
int main(){
Base*ptrToDerived=新派生的;
自动d=*ptr导出;
d、 你好;
}
我希望变量d
保存类型为Derived
的对象,而不是类型为Base
的对象,没有动态内存分配,也没有显式强制转换
我已经看过了,但是答案中提出的解决方案需要动态内存分配,因为它返回指向新对象的指针,而不是新对象的值
这在C++11中可能吗?不可能,因为如果
d
没有动态存储持续时间,那么它必须有静态、线程或自动存储持续时间,在所有这些情况下,对象的类型在编译时是已知的。在您的情况下,您希望在运行时确定对象的类型,因为ptrToDerived
可能指向Base
对象或Derived
对象,或者指向从Base
派生的其他类的对象
如果您担心的是生存期和内存泄漏,只需让
clone
返回一个std::unique\u ptr
而不是Base*
,我想您的意思是希望auto
推断为D
但是这是不可能的:所有类型都必须在编译时已知。想象一下,如果代码是:
Base *b = some_func();
auto d = *b;
编译器无法知道
b
指向的动态类型,因为它可能要到运行时才能确定。这很不幸。出于性能原因,我正在避免动态内存分配。@merlin2011:研究一种变体(例如,boost::variant
),它可以在内存块中存储许多派生类中的一个。当然,这迫使您静态地知道您可能需要哪些派生类。您能以某种方式限制您的类层次结构吗?如果类型的数量有限,可以使用boost::variant
。如果可以将对象的最大可能大小限制在合理的值内,则可以创建一个类似指针的智能类来管理它。@milleniumbug,实际上派生类是一个模板类,因此我认为无法绑定它。