考虑下面的例子:
#include <iostream>
using namespace std;
class base
{
public:
virtual int func()
{
cout << "vfunc in base class\n";
return 0;
}
};
class derived: public base
{
public:
double func()
{
cout << "vfunc in derived class\n";
return 0;
}
};
int main()
{
base *bptr = new derived;
bptr->func();
return 0;
}
编译器对上述代码给出错误,指出重写函数存在类型冲突。为什么不能用不同的返回类型重写派生类中的函数?
我相信,为了重写函数,需要在派生类中重新定义基类虚拟方法。要重新定义方法,方法的签名必须相同。由于返回类型不是签名的一部分,我相信即使返回类型存在差异,该方法仍然会被重新定义吗?在这种情况下,对于上面的代码,虚函数func
在派生类中用不同的返回类型重新定义。但编译器会抛出错误。我的理解正确吗?
重写本质上意味着将在运行时调用基类方法或派生类方法,具体取决于指针指向的实际对象。
这意味着:
即:可以调用基类方法的每个地方都可以通过调用派生类方法来替换,而无需对调用代码进行任何更改。
为了实现这一点,唯一可能的方法是限制重写虚拟方法的返回类型以返回与基类相同的类型或从基类派生的类型(协变返回类型),并且标准强制执行此条件。
如果上述条件不具备,就会留下一个窗口,通过添加新功能来破坏现有代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)