C++ 派生类的超隐函数

C++ 派生类的超隐函数,c++,inheritance,overriding,C++,Inheritance,Overriding,我在用AVL树调用重写函数时遇到一些问题。它正在呼叫BST树上的那个。这比通常更令人困惑,因为AVLNode是从BinaryNode派生的。我需要添加一个高度数据成员。这可能是造成问题的原因,还是比这更简单 class BST { public: Parent():root(NULL) { } void insert( const string & x, int lineNum, int& count ) { inse

我在用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
};
BST类
{
公众:
父():根(空){}
无效插入(常量字符串和x、整数行数、整数和计数)
{
插入(x,lineNum,root,count);
}
受保护的:
二进制节点*根;
无效插入(常量字符串和x、整数行数、节点*&t、整数和计数)
{//东西
}
};
AVL类:公共BST
{
公众:
无效插入(常量字符串和x、整数行数、整数和计数)
{

cout您需要将要覆盖的函数设置为虚拟。例如:

 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*的insert方法不会覆盖带有Node*的方法。它将创建insert方法的新重载


另外,需要明确的是,没有理由通过引用传入指针,除非您打算更改函数中指针(而不是指向的指针)的值,并希望更改在调用方中可见。通过引用传入只会添加不必要的取消引用(根据上述警告).

如何创建AVL树以及如何调用方法?添加virtual似乎解决了一些问题。它修复了insert,但当我在重写并返回AVLNodes而不是BSTNodes的函数时仍然遇到问题。这是不可能的吗?如果您试图更改的只是返回类型,您将bably得到一个错误(我知道)。如果您正在更改参数中的任何内容(如您给出的Node->AVLNode示例),它将重载而不是重写。