C ++构造函数的派生类数组的副本

时间:2018-03-13 16:27:21

标签: c++

虽然在复制构造函数中有许多管理指针的帖子,但我没有找到合适的答案来正确实现以下内容。

A类的对象'a'存储一个'tab'元素数组,这些元素是指向B1或B2类型元素的指针,两者都是从B类派生的。

我想通过调用复制构造函数来保存“a”的副本(以便稍后恢复)。 我的问题是在这个拷贝构造函数中分配内存,以复制'tab [i]'元素的内容。

必须有一种规范的方式来做到这一点(我想没有调用 < dynamic_cast的>确定这是B1型还是B2型。

这是我建立的MWE来说明问题:

#include <iostream>
using namespace std;


//-----------------------
class B {
public:
  virtual void display()=0;
};

//-----------------------
class B1 : public B {
public:
  B1() : val(1)  // ctor
  {}  
  void display() {
    cout << val << endl;
  }
private:
  int val;

};
//-----------------------
class B2 : public B {
public:
  B2() : val(2)  // ctor
  {}
  void display() {
    cout << val << endl;
  }
private:
  int val;

};

//---------- A -------------
class A {

public:
  A () {            // ctor
    tab = new B * [2];
    tab[0] = new B1;
    tab[1] = new B2;
  } 

  A (A const &orig)         // copy ctor
    : tab(orig.tab)
  {          
    // ... HOW should i make a copy of the tab[i] elements ?...
    // ... as i do not know if tab[i] is type B1 or B2 ...
  }

  void display() {
    tab[0]->display();   
    tab[1]->display();   
  }


private:
  B ** tab;
};




//------M A I N ---------

int main() {
  A a;
  a.display();

  return 0;
}

1 个答案:

答案 0 :(得分:4)

如果不通过使用dynamic_cast确定B的具体类型,或者通过调用虚拟方法,然后将其分派到具体类型,则无法执行此操作。

这通常通过使用&#34;克隆&#34;来解决。 B界面上的模式,将函数添加到Bvirtual B* clone() const = 0; 每个实现分配并返回自己的适当副本。

另请注意,您没有删除示例中分配的任何内存。记得在析构函数中执行此操作,或者更好地使用像std :: unique_ptr!

这样的智能指针