簡體   English   中英

C ++構造函數傳遞對基類對象的引用

[英]c++ constructor pass a reference to a base class object

我正在嘗試了解副本構造函數。 在下面的構造函數定義中,類DataModelComputationModel派生。

我的問題是,當您將對基類的引用傳遞給派生類的構造函數時,這是副本構造函數嗎?

為什么默認的復制構造函數在這里不夠用?

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.

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