[英]c++ constructor pass a reference to a base class object
我正在嘗試了解副本構造函數。 在下面的構造函數定義中,類DataModel
從ComputationModel
派生。
我的問題是,當您將對基類的引用傳遞給派生類的構造函數時,這是副本構造函數嗎?
為什么默認的復制構造函數在這里不夠用?
class DataModel : public ComputationModel {
public:
DataModel(const ComputationalModel &other);
//..
};
mv::DataModel::DataModel(const ComputationModel &other) :
ComputationModel(other)
{}
從技術上講,您可以使用ComputationalModel
引用作為函數參數來定義DataModel
的副本構造函數。
DataModel d1(/* Parameter... */);
ComputationModel c1(/* Parameter... */);
DataModel d2(d1); // copy-construct instance, d1 passed as refence to the base class
DataModel d3(c1); // same behavior
但是,這幾乎絕不是一個好主意,因為對象的復制構造通常需要從中復制對象的狀態。 傳遞基類引用時,將刪除派生類實例的所有數據成員,這會使新創建的對象處於難以從客戶端代碼猜到的狀態。
在您的情況下,默認的復制構造函數具有完全相同類型的const限定引用參數:
DataModel(const DataModel& other) = default;
這將我帶到您的最后一個問題
為什么默認的復制構造函數在這里不夠用?
如果不查看繼承層次結構的其余部分,這很難分辨。 指導原則是:如果層次結構中所有數據成員的副本構造函數執行正確的操作,則默認的副本構造函數也執行正確的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.