调用派生函数而不是基本c ++

时间:2017-12-07 19:01:11

标签: c++

为什么下面的代码会调用基类'第二次通话中的方法?

基类:

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

1 个答案:

答案 0 :(得分:1)

bool(Int*)bool(Number*)的类型不同,因此您的函数Int::isEqual 覆盖Number::isEqual - 而是&#39} ;完全独立的功能。

想一下;尝试的覆盖是没有意义的:你的派生类需要一个约束参数,但基函数的参数受到的约束较少!如果允许您想要的内容,可以使用任何 nPtr->isEqual指针调用Number,派生类不支持该指针!

正确的问题是协变返回类型,但逆变参数。但是,C ++不允许使用逆变参数覆盖。