11

我正在制作一棵具有几种不同节点类型的树:二元节点、一元节点和终端节点。我有一个所有节点都继承自的 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);

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

4

3 回答 3

12

您需要实现克隆。

   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); };
   };

等等

于 2011-10-27T07:53:46.480 回答
4

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

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

node您正在为其编写clone-method的课程在哪里。您当然必须在基类中声明该方法:

virtual gpnode* clone() const = 0;
于 2011-10-27T07:50:03.080 回答
3

使用虚拟构造函数

于 2011-10-27T07:49:24.187 回答