簡體   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