c++ - 覆盖具有不同返回类型的成员函数

标签 c++ virtual-functions overriding redefinition

考虑下面的例子:

#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/

相关文章:

派生类中函数的 C++ "virtual"关键字。有必要吗?

swift - 间接调用在 Swift 3 中调用了错误的专用泛型函数

java - 方法不重写或实现父类(super class)型的方法

ios - 在 Swift 中覆盖父类(super class)委托(delegate)

c++ - 什么是具有静态存储期限的临时对象

c++ - 加载WinRT组件而不引用DLL/程序集

c++ - 使用 Objective-C 获取 Photoshop 的 Action 列表

c# - 执行路径特定断点

C++:这种编译时多态性技术如何称呼?有什么优点和缺点?

c++ - 以参数为类指针的虚函数