C ++ Вызов конструктора копирования для неизвестного производного класса через абстрактный базовый класс - PullRequest
10 голосов
/ 27 октября 2011

Я создаю дерево, которое имеет несколько разных типов узлов: двоичный узел, унарный узел и терминальный узел.У меня есть азбука, от которой наследуются все узлы.Я пытаюсь написать рекурсивный конструктор копирования для дерева следующим образом:

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.Как заставить его интеллектуально вызывать конструктор копирования, который мне нужен?

Ответы [ 3 ]

11 голосов
/ 27 октября 2011

Вам нужно реализовать клонирование.

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

* 1004 несущественные дополнения *

4 голосов
/ 27 октября 2011

Для этого вы должны предоставить clone -метод для ваших объектов, который возвращает указатель соответствующего типа. Если все ваши классы имеют конструкторы копирования, это так просто:

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

Где node - класс, для которого вы пишете clone -метод. Конечно, вы должны объявить этот метод в своем базовом классе:

virtual gpnode* clone() const = 0;
3 голосов
/ 27 октября 2011
...