调用派生函数而不是基C++

调用派生函数而不是基C++,c++,C++,为什么下面的代码在第二次调用中调用基类的方法 基类: class Number{ public: Number(){} virtual print(){cout<<"Number"<<endl;} virtual bool isEqual (Number* number){ cout<<"Base class"<<endl;} }; 顺便说一下: i1.isEqual(&

为什么下面的代码在第二次调用中调用基类的方法

基类:

class Number{

      public:
         Number(){}     

        virtual print(){cout<<"Number"<<endl;}
        virtual bool isEqual (Number* number){ cout<<"Base class"<<endl;}
};
顺便说一下:

i1.isEqual(&i2); /// prints 0 -- works fine
boolInt*与boolNumber*的类型不同,因此函数Int::isEqual不会覆盖Number::isEqual-相反,它是一个完全独立的函数

想想看;尝试的重写没有意义:派生类需要一个受约束的参数,但基函数的参数受约束较少!如果您想要的是允许的,那么可以使用派生类不支持的任何数字指针调用nPtr->isEqual


正确的问题是协变返回类型,但参数是逆变的。但是,C++不允许反参数重写器。

尝试添加这些函数的重写。你会感到惊讶的。此外,print缺少返回类型。对于伪代码来说,它有点太伪了。isEqual在基类和派生类中具有不同的签名。您已重载该函数。当您使用基类指针调用时,它会调用Number::isEqual;当您使用Int-pointer/ref调用时,它会调用Int::isEqual。因此编译会根据名称和返回类型重写函数。@AbdKhatib:No。根据名称和类型。值得注意的是,您的两个函数具有相同的返回类型。但是,它们的类型不同。具有不同参数的函数被视为不同的函数?@AbdKhatib-是的。C++允许你重载所有的函数。注意,它与覆盖虚拟成员不同。
int main(){
Int i1(3);
Int i2(4);

Number* nPtr = &i1;

nPter->print();  ///  prints 3
nPter->isEqual(&i2); /// "Base class"

...
i1.isEqual(&i2); /// prints 0 -- works fine