繁体   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