簡體   English   中英

在 C++ 中復制只有基類指針的派生類

[英]Copy a derived class with only a base class pointer in C++

我正在嘗試制作只有一個基類指針的派生類的副本。

所以如果我有:

class BaseClass; //Abstract class with =0 functions
class LeftClass : BaseClass;
class RightClass : BaseClass;

我有一個將 BaseClass 作為參數的函數:

void Function(BaseClass* baseClass)

我想復制 BaseClass,但我也想復制 LeftClassRightClass 的擴展功能,但我不知道將哪個傳遞給函數 - 兩者都是可能的。

所以我有這樣的事情:

//global
vector<BaseClass*> myVector;

void Function(BaseClass* baseClass)
{
   BaseClass* baseClassCopy = new BaseClass(baseClass);
   myVector.push_back(baseClassCopy);
}   

然后我用左類或右類調用函數

int main()
{
   LeftClass leftClass;
   Function(&leftClass);
   LeftClass* ResultOfCopy = myVector.at(0);
}

該代碼不會復制整個左類作為副本,有沒有辦法做到這一點我忽略了?

BaseClass也是抽象的,有些函數是=0所以我不能新建一個。 否則在其他類中有一個復制函數要使用。

如果您無法更改任何類以添加克隆函數,那么您可以通過使用dynamic_cast來確定其運行時類型並調用正確的派生構造函數來手動執行此操作。 那看起來像

void Function(BaseClass* baseClass)
{
    if (auto ptr = dynamic_cast<LeftClass*>(baseClass))
        myVector.push_back(new LeftClass(*ptr));
    if (auto ptr = dynamic_cast<RightClass*>(baseClass))
        myVector.push_back(new RightClass(*ptr)); 
}  

你可以看到它在這個活生生的例子中工作

這類問題通常通過clone()方法解決。

class BaseClass
{
    virtual BaseClass* clone()            = 0
};

class LeftClass: public BaseClass
{
    virtual LeftClass* clone() override {return new LeftClass(*this);}
};
class RightClass: public BaseClass
{
    virtual RightClass* clone() override {return new RightClass(*this);}
};
class RightRightClass: public RightClass
{
    virtual RightRightClass* clone() override {return new RightRightClass(*this);}
};

您的函數現在很容易編寫:

void Function(BaseClass* baseClass)
{
   BaseClass* baseClassCopy = !baseClass ? nullptr : baseClass->clone();
   myVector.push_back(baseClassCopy);
}   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM