考虑下面的示例:
#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
。但是编译器会引发错误。我的理解正确吗? 最佳答案
从本质上讲,重写意味着在运行时将根据指针所指向的实际对象调用基类方法或派生类方法。
这意味着:
即:可以在不对调用代码进行任何更改的情况下,通过调用派生类方法来替换可以调用基类方法的每个位置。
为了实现这一点,唯一可能的方法是限制重写虚拟方法的返回类型,使其返回与基类相同的类型或从该基类派生的类型(协变量返回类型),并且标准强制执行此条件。
如果上述条件不成立,则会通过添加新功能留下一个打破现有代码的窗口。
关于c++ - 覆盖具有不同返回类型的成员函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8967303/