簡體   English   中英

在派生類中調用基類副本構造函數

[英]Calling Base Class Copy Constructor in Derived Class

只是作為序言,我在發布之前做了很多閱讀,因為我知道這可能是一個非常基本的問題,但是我仍然缺少一些東西,所以如果這樣做了,請提前抱歉...

我有一個基於另一個類的模板派生類:

  class BaseBuffer
  {
    public:
    // Constructor
    BaseBuffer() {};
    BaseBuffer(long buf_size);
    BaseBuffer(const BaseBuffer& orig);
....
  template <class T>
  class DataBuffer : public BaseBuffer
  {
....

我正在實現DataBuffer的副本構造函數。 我已經為BaseBuffer編寫了復制構造函數,如上所示。

現在,據我所知,要在復制DataBuffer調用BaseBuffer的副本,我必須

    DataBuffer(const DataBuffer& orig) : BaseBuffer(orig)
    {
      // Initialize an array of memory given the type
      buf_ = new T[size_];
      ....

另一個SO答案指出, BaseBuffer(orig)應該在其中“這將調用Base子對象上的Base復制構造函數。”

當我不這樣做時,就會發生預期的壞事情:不會復制屬於BaseBuffer所有屬性。

當我這樣做時,發生了意外的壞事:當代碼到達調用BaseBuffer(orig)的地步時,我得到了EXC_BAD_ACCESS。

所以這對我來說是有意義的,也沒有意義。 由於DataBuffer是從BaseBuffer繼承的,所以可以調用BaseBuffer復制構造函數是有意義的,它只會“查找”它所知道的內存位置,並且所有DataBuffer多余內容都“適合”該基數。

但另一方面,嚴格來講,調用BaseBuffer(&<DataBuffer>)似乎沒有道理,因為我僅定義了BaseBuffer(&<BaseBuffer>)

所以我的問題分為兩個部分,

  1. 為什么使用這種“正確的” DataBuffer(const DataBuffer& orig) : BaseBuffer(orig) {...}語法(如果不正確,對不起)?
  2. 如何防止EXC_BAD_ACCESS?

先感謝您。

底線:我錯了。

大家都說過,語法

DataBuffer(const DataBuffer& orig) : BaseBuffer(orig) {...}

是正確的,並且錯誤在我的代碼的其他地方。 就我而言,我試圖在對象初始化之前復制它。 很抱歉浪費大家的時間。

暫無
暫無

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

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