У меня возникли проблемы с вызовом переопределенных функций в моем дереве AVL. Он вызывает тот из дерева BST. Это немного более запутанно, чем обычно, потому что AVLNode является производным от BinaryNode. Мне нужно было добавить элемент данных высоты. Может ли это быть причиной проблемы или это проще, чем это.
class BST
{
public:
Parent():root(NULL) { }
void insert( const string & x, int lineNum, int& count )
{
insert(x, lineNum, root, count);
}
protected:
BinaryNode* root;
void insert( const string & x, int lineNum, Node * & t, int& count )
{//stuff
}
};
class AVL:public BST
{
public:
void insert( const string & x, int lineNum, int& count )
{
cout << "INSERT\n";
insert(x, lineNum, root, count);
}
protected:
AVLNode* root;
void insert( const string & x, int lineNum, AVLNode * & t, int& count )
{
cout << "insert\n";
//different stuff
}
};
class BinaryNode
{//constructors
}
class AVLNode:public BinaryNode
{//constructors
};
Вам нужно сделать функции, которые вы хотите переопределить, виртуальными. Например:
virtual void insert( const string & x, int lineNum, int& count )
{
insert(x, lineNum, root, count);
}
virtual void insert( const string & x, int lineNum, Node * & t, int& count )
{//stuff
}
Метод вставки с AVLNode * не будет переопределять метод с Node *. Это создаст новую перегрузку метода вставки вместо этого.
Кроме того, для ясности, нет никакой причины передавать указатели по ссылке, если только вы не намереваетесь изменить значение указателя (не наведенного на) в функции и не хотите, чтобы это изменение было видно в вызывающей стороне. Передача по ссылке просто добавит ненужную разыменовку (с учетом вышеупомянутого предостережения).
Других решений пока нет …