调用派生功能而不是基本C

derived function is invoked instead of base c++

本文关键字:派生 功能 调用      更新时间:2023-10-16

为什么下面的代码在第二个呼叫中调用基类方法?

基类:

class Number{
      public:
         Number(){}     
        virtual print(){cout<<"Number"<<endl;}
        virtual bool isEqual (Number* number){ cout<<"Base class"<<endl;}
};

派生类:

class Int: public Number{
   int member;
     public:
        Int(int number){ member =number; }
       int get Number(){ return member; }
       print(){ cout<<"member"<<endl;}
       bool isEqual(Int* number){ return member == number->getNumber(); }
};

主要功能:

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

bool(Int*)bool(Number*)不同,因此您的函数 Int::isEqual do override Number::isEqual-相反,它是一个完全独立的函数。

只是想一会一分钟;尝试的替代毫无意义:您的派生类期望有限的参数,但是基本函数的参数较少约束!如果允许您想要的,则可以使用任何 Number指针来调用nPtr->isEqual,而派生类不支持!


正确的问题是 convariant 返回类型,但 contravariant 参数。但是,C 不允许违反参数替代者。