C++ 使用不同的返回类型覆盖虚拟函数
C++ Overriding virtual function with different return type
我刚才很惊讶地看到这段代码(释义(构建了。
class Foo
{
protected:
virtual bool CheckThis(int id);
}
class Bar : public Foo
{
protected:
virtual tErrorCode CheckThis(int id, char something);
};
我认为不可能用不同的返回类型覆盖函数?不知何故,这建立了。操作系统是vxworks。
事实上,这种方法:
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;
};
我认为不可能用不同的返回类型覆盖函数?
是的,这是可能的,但有一些限制。
特别是,您不能使用所需的任何类型,只能使用协变类型。
此外,参数类型必须相同,否则它不是重写。
例:
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);
};
从 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
的。
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 使用不同的返回类型覆盖虚拟函数
- C++ 使用不同的返回类型覆盖虚拟函数
- 衍生模板类的覆盖返回类型
- 覆盖方法返回类型,在C 中使用不完整的派生类
- C 多重继承,虚拟方法覆盖问题和协变量返回类型
- 与基类不同的返回类型的C 覆盖功能
- 虚函数与它覆盖的函数的返回类型不协变
- 我可以在覆盖虚函数的返回类型中丢失"constness"吗?
- 是覆盖返回类型所需的指针-继承
- 变量返回类型上转换覆盖c++
- 尾随返回类型中的占位符是否覆盖初始占位符
- 返回类型与被覆盖的虚函数"MediaFactory :: FMediaDevice"的返回类型"MediaDevice*"不相同,也不协变