通过抽象基类调用未知派生类的复制构造函数



我正在制作一个具有几种不同节点类型的树:二进制节点、一元节点和终端节点。我有一个ABC所有的节点都是从它继承的。我试着为树写一个递归复制构造函数,像这样:

class gpnode
{
public:
  gpnode() {};
  virtual ~gpnode() {};
  gpnode(const gpnode& src) {};
  gpnode* parent;
}
class bnode:gpnode
{
public:
  bnode() {//stuff};
  ~bnode() {//recursive delete};
  bnode(const bnode& src)
  {
    lnode = gpnode(src.lnode);
    rnode = gpnode(src.rnode);
    lnode->parent = this;
    rnode->parent = this;
  }
  gpnode* lnode;
  gpnode* rnode;
}
class unode:gpnode
{
public:
  unode() {//stuff};
  ~unode() {//recursive delete};
  unode(const unode& src)
  {
    node = gpnode(src.node);
    node->parent = this;
  }
  gpnode* node;
}

我的问题是我不能做

node = gpnode(src.node);

,因为gpnode是一个虚类。我可以写

node = unode(src.node);

,但当unnode的子节点是bnode时,这不起作用。如何让它智能地调用我需要它调用的复制构造函数?

您需要实现克隆。

   class base
   {
   public:
       virtual base* clone() const = 0;
   }
   class derived : public base
   {
   public:
       derived(){}; // default ctor
       derived(const derived&){}; // copy ctor
       virtual derived* clone() const { return new derived(*this); };
   };

其余

要做到这一点,您必须为您的对象提供一个clone -方法,该方法返回适当类型的指针。如果所有的类都有复制构造函数,就像这样简单:

node* clone() const {
    return new node(*this);
}

其中node是您正在为其编写clone方法的类。当然,您必须在基类中声明该方法:

virtual gpnode* clone() const = 0;

使用虚拟构造函数

最新更新