在 c++ 中具有不同返回类型的重写方法
Override method with different return type in c++
我是 c++ 的初学者,所以如果我的问题很愚蠢,请原谅。我有4个班级:ProgramNodeBase
,ProgramNode
,FunctionBase
,Function
。 ProgramNode
源于ProgramNodeBase
,Function
源于FunctionBase
。 ProgramNodeBase
具有指向FunctionBase
的指针向量以及可以从中返回项目的方法。是否可以在派生类ProgramNode
中重写此方法,使其返回Function
而不是FunctionBase
?我在这里查看了一些答案,但没有找到任何返回类型的来源。
我问是因为我有需要Function
的方法,这只能返回FunctionBase
所以当我想调用它时需要一些强制转换。有没有一些简单的方法来解决这个问题?
这只是我的代码片段,但它涵盖了我遇到的问题。我希望这个问题是明确的,而不是微不足道的。
// ProgramNodeBase.h
#include <vector>
class FunctionBase;
class ProgramNodeBase
{
protected:
std::vector<FunctionBase*> m_edgeFn;
public:
ProgramNodeBase();
virtual ~ProgramNodeBase();
virtual FunctionBase* GetEdgeFunction(unsigned int position);
};
// ProgramNodeBase.cpp
#include "ProgramNodeBase.h"
ProgramNodeBase::ProgramNodeBase() { }
ProgramNodeBase::~ProgramNodeBase() { }
FunctionBase* ProgramNodeBase::GetEdgeFunction(unsigned int position)
{
if (position < m_edgeFn.size())
{
return m_edgeFn[position];
}
return nullptr;
}
// FunctionBase.h
class FunctionBase
{
public:
FunctionBase();
virtual ~FunctionBase();
};
// FunctionBase.cpp
#include "FunctionBase.h"
FunctionBase::FunctionBase() { }
FunctionBase::~FunctionBase() { }
// ProgramNode.h
#include "ProgramNodeBase.h"
class ProgramNode : public ProgramNodeBase
{
public:
ProgramNode();
~ProgramNode();
// ??? Function* ProgramNodeBase::GetEdgeFunction(unsigned int position)
FunctionBase* GetEdgeFunction(unsigned int position) override;
};
// ProgramNode.cpp
#include "ProgramNode.h"
ProgramNode::ProgramNode() { }
ProgramNode::~ProgramNode() { }
// ??? Function* ProgramNodeBase::GetEdgeFunction(unsigned int position)
FunctionBase* ProgramNodeBase::GetEdgeFunction(unsigned int position)
{
if (position < m_edgeFn.size())
{
return m_edgeFn[position];
}
return nullptr;
}
// Function.h
#include "FunctionBase.h"
class Function : public FunctionBase
{
public:
Function();
~Function();
};
// Function.cpp
#include "Function.h"
IFunction::Function() { }
IFunction::~Function() { }
是的,C++确实支持带有原始指针的协变返回类型。因此,可以执行以下操作:
class ProgramNodeBase
{
public:
virtual FunctionBase* GetEdgeFunction(unsigned int position);
};
class ProgramNode : public ProgramNodeBase
{
public:
Function* GetEdgeFunction(unsigned int position) override;
};
为此,Function
的定义必须在声明覆盖器的位置可用 - 编译器必须能够验证返回类型是否实际上是协变的。
当然,您必须为覆盖程序提供适当的实现。
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- 在 C++ 中用派生类型重写成员函数
- 具有引用返回类型的重写方法上的协变返回类型无效
- 重写运算符的返回类型=
- C++重写 void 函数返回类型会导致生成失败
- 重写虚函数协变返回类型(两个指针)
- 重写基类返回类型
- 如何自动更新重写方法的 *this 返回类型
- 在 c++ 中具有不同返回类型的重写方法
- 重写虚拟函数返回类型不同,并且不是协变的
- 重写子类中的返回类型
- 重写虚函数返回类型不同且不是协变的
- 如何使用泛型返回类型重写虚拟函数
- 我可以在c++中重写字符串返回类型函数吗?