0

我在用我的 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
};
4

1 回答 1

0

您需要使要覆盖的功能成为虚拟的。例如:

 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* 的方法。它将创建一个新的插入方法重载。

另外,为了清楚起见,没有理由通过引用传递指针,除非您打算更改函数中指针(而不是指向)的值并希望更改在调用者中可见。通过引用传递只会添加不必要的取消引用(受上述警告的影响)。

于 2012-10-02T05:46:45.247 回答