Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中是否存在一种机制+;要从基类指针生成派生类的完整副本而不进行动态内存分配?_C++_Pointers_C++11_Auto - Fatal编程技术网

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,实际上派生类是一个模板类,因此我认为无法绑定它。