在派生类中调用基类副本构造函数

时间:2019-06-25 15:25:19

标签: c++

仅作为序言,我在发帖之前做了很多阅读,因为我知道这可能是一个非常基本的问题,但是我仍然缺少一些内容,因此如果这样做了,请提前抱歉...

我有一个基于另一个类的模板派生类:

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

我正在为DataBuffer实现副本构造函数。如上所述,我已经为BaseBuffer编写了复制构造函数。

据我所知,现在要在复制BaseBuffer时调用DataBuffer的副本,我必须这样做

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

其中BaseBuffer(orig)应该作为另一个S.O.回答说:“这将在Base子对象上调用Base复制构造函数。”

当我不这样做时,就会发生预期的坏事:不会复制属于BaseBuffer的所有属性。

这样做时,会发生意外的坏事:当代码到达调用BaseBuffer(orig)的地步时,我得到EXC_BAD_ACCESS。

所以这对我来说是有道理的。由于DataBuffer是从BaseBuffer继承而来的,因此我可以调用BaseBuffer复制构造函数,并且它只会“查找”它知道的内存位置以及所有{{ 1}}多余的东西“适合”了基地。

但另一方面,严格来说,调用DataBuffer似乎没有任何意义,因为我仅定义了BaseBuffer(&<DataBuffer>)

所以我的问题分为两部分,

  1. 为什么这种“正确” BaseBuffer(&<BaseBuffer>)语法(如果不正确,对不起)?
  2. 如何防止EXC_BAD_ACCESS?

谢谢。

1 个答案:

答案 0 :(得分:0)

底线:我弄错了。

每个人都说语法

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

是正确的,并且错误在我的代码的其他地方。就我而言,我试图在对象初始化之前复制它。很抱歉浪费大家的时间。