C ++使用不同的返回类型覆盖虚函数

时间:2017-07-26 19:29:17

标签: c++

我刚才很惊讶地看到这段代码(释义)已经建成。

class Foo
{
  protected:
     virtual bool CheckThis(int id);
}

class Bar : public Foo
{
  protected:
     virtual tErrorCode CheckThis(int id, char something);
};

我认为无法覆盖具有不同返回类型的函数?不知何故,这建成。操作系统是vxworks。

3 个答案:

答案 0 :(得分:5)

实际上,这种方法:

virtual tErrorCode CheckThis(int id, char something);

不覆盖任何内容,因为它与此方法具有不同的签名:

virtual bool CheckThis(int id);

注意,您可以使用override说明符来确保派生类中的方法实际上覆盖基类的方法。

所以,这段代码:

class Foo {
  protected:
     virtual bool CheckThis(int id);
};

class Bar : public Foo
{
  protected:
     virtual tErrorCode CheckThis(int id, char something) override;
};

不会编译,但这个会:

class Foo {
  protected:
     virtual bool CheckThis(int id);
};

class Bar : public Foo
{
  protected:
     virtual bool CheckThis(int id) override;
};

答案 1 :(得分:0)

  

我认为无法覆盖具有不同返回类型的函数?

是的,这是可能的,但有一些限制。

特别是,您无法使用任何类型,只能使用covariant type

此外,参数类型必须相同,否则不是覆盖。

示例:

class type1 {};
class type2 : public type1 {};

class Foo {
   protected:
      virtual type1& CheckThis(int id);
}

class Bar : public Foo
{
   protected:

      // This is not an override, it is an overload.
      virtual type2& CheckThis(int id, char);

      // This is an override.
      virtual type2& CheckThis(int id);
};

答案 2 :(得分:0)

从C ++ 11开始,您应该使用特殊的override关键字。它允许编译器检查基类是否有派生类重写的方法。

Live example

class Foo 
{
  protected:
     virtual bool CheckThis(int id);
}

class Bar : public Foo
{
  protected:
     tErrorCode CheckThis(int id, char something) override; // error:  marked 'override', but does not override
};

此外,由于您重写了基类方法,因此派生类中不需要virtual关键字。基本方法是virtual,因此覆盖方法是隐式virtual