Я создаю дерево, которое имеет несколько разных типов узлов: двоичный узел, унарный узел и конечный узел. У меня есть 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);
, но это не сработает, если дочерний элемент юнода является bnode. Как мне заставить его разумно вызывать конструктор копирования, который мне нужен?