为什么下面的代码会调用基类'第二次通话中的方法?
基类:
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
答案 0 :(得分:1)
bool(Int*)
与bool(Number*)
的类型不同,因此您的函数Int::isEqual
不覆盖Number::isEqual
- 而是&#39} ;完全独立的功能。
想一下;尝试的覆盖是没有意义的:你的派生类需要一个约束参数,但基函数的参数受到的约束较少!如果允许您想要的内容,可以使用任何 nPtr->isEqual
指针调用Number
,派生类不支持该指针!
正确的问题是协变返回类型,但逆变参数。但是,C ++不允许使用逆变参数覆盖。