C ++通过抽象基类在未知派生类上调用复制构造函数 [英] C++ Calling a copy constructor on an unknown derived class through an abstract base class

查看:262
本文介绍了C ++通过抽象基类在未知派生类上调用复制构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建一个树,它有几种不同的节点类型:二进制节点,一元节点和终端节点。我有一个ABC,所有的节点继承。我想为树写一个递归复制构造函数,如下:

I'm making a tree that has several different node types: a binary node, a unary node, and a terminal node. I've got an ABC that all the nodes inherit from. I'm trying to write a recursive copy constructor for the tree like so:

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是一个虚拟类。我可以做

because gpnode is a virtual class. I could do

node = unode(src.node);

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

but that doesn't work when the child of a unode is a bnode. How do I get it to intelligently call the copy constructor I need it to?

推荐答案

您需要实施克隆。

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

Etceteras

Etceteras

这篇关于C ++通过抽象基类在未知派生类上调用复制构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆