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 に答える