繁体   English   中英

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

[英]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类型的对象,没有动态内存分配,也没有显式强制转换。

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

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

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

如果您关注的是生命周期和内存泄漏,请让clone返回std::unique_ptr<Base>而不是Base*

我想你的意思是你想要auto演绎到D

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM