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