c++ - 函数覆盖不同的返回类型

标签 c++ overriding return-type

返回类型是否影响函数覆盖? (据我所知,返回类型不是函数/方法签名的一部分) 在基类中,我有一个函数,它不获取参数,返回 int 并且是纯虚拟的。在每个派生类中,我为返回类型定义一个枚举。该函数在派生类中被覆盖,即它具有相同的签名但行为不同。 问题是:覆盖和返回类型不是函数覆盖的一部分是否合法?

代码示例:

class Base
{
  public:
  typedef int ret;
  virtual ret method() = 0;
};

class Der1
{
public:
  enum ret1{
    ret1_0,
    ret1_1
  };
  ret1 method() { return ret1_1;}
};

class Der1
{
public:
  enum ret2{
    ret2_0,
    ret2_1
  };
  ret1 method() { return ret2_0;}
};

最佳答案

您可以覆盖具有不同返回类型的函数,但只允许协变返回类型

Function Overriding 是指根据指针指向的实际对象,在运行时调用 Base 类方法或 Derived 类方法。
这意味着:
即:可以调用 Base 类方法的每个地方都可以调用 Derived 类方法来替换,而不需要对调用代码进行任何更改。

为了实现这一点,唯一可能的方法是限制重写虚方法的返回类型以返回与基类相同的类型或从基类派生的类型(共变返回类型),因此标准强制执行这种情况。

如果没有这个条件,现有代码将因添加新功能(新的覆盖函数)而中断。

关于c++ - 函数覆盖不同的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15064247/

相关文章:

当存在移动和复制构造函数时,C++ 默认构造函数未使用 "using"继承

c++ - 从同一来源分配不同的值。奇怪的

c - 指针返回内存地址?

java - 重写 equals 方法时如何指定两个对象?

c# - 为什么返回集合接口(interface)而不是具体类型?

c# - 从函数返回多个列表

带有冒泡排序的 C++ 结构

c++ - 如何将文件中的长字符串读入数组或类似的东西?

java - 当我们覆盖 toString() 方法时,我们应该始终返回对象的字符串表示形式吗?

c# - 帮助覆盖 C# .NET