C++通过抽象基类在未知派生类上调用复制构造函数

Lin*_*des 11 c++ inheritance copy-constructor abstract-base-class

我正在创建一个具有多种不同节点类型的树:二进制节点,一元节点和终端节点.我有一个所有节点继承的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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我做不到

node = gpnode(src.node);
Run Code Online (Sandbox Code Playgroud)

因为gpnode是一个虚拟类.我可以

node = unode(src.node);
Run Code Online (Sandbox Code Playgroud)

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

Moo*_*ice 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); };
   };
Run Code Online (Sandbox Code Playgroud)

Etceteras

  • 我想有可能以奇怪的重复模式自动执行_clone_实现 (2认同)
  • @Yannick,我们在任何成员函数上使用const限定符的原因相同-我们不“修改”任何东西,而克隆也不应该修改任何东西。:) (2认同)