[英]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,但我也想復制 LeftClass或RightClass 的擴展功能,但我不知道將哪個傳遞給函數 - 兩者都是可能的。
所以我有這樣的事情:
//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.