我刚才很惊讶地看到这段代码(释义)已经建成。
class Foo
{
protected:
virtual bool CheckThis(int id);
}
class Bar : public Foo
{
protected:
virtual tErrorCode CheckThis(int id, char something);
};
我认为无法覆盖具有不同返回类型的函数?不知何故,这建成。操作系统是vxworks。
答案 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
关键字。它允许编译器检查基类是否有派生类重写的方法。
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
。