在 C++ 中使用不同 return 类型覆盖方法
Override method with different return type in c++
我是 C++ 的初学者,如果我的问题很愚蠢,请原谅。我有 4 个 classes:ProgramNodeBase
、ProgramNode
、FunctionBase
、Function
。 ProgramNode
派生自 ProgramNodeBase
,Function
派生自 FunctionBase
。 ProgramNodeBase
具有指向 FunctionBase
的指针向量和可以从中 return 项的方法。是否可以在派生 class ProgramNode
中以 return Function
而不是 FunctionBase
的方式覆盖此方法?我在这里查看了一些答案,但没有找到 return type derived.
我问是因为我有需要 Function
的方法,而这只能 return 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++ 支持具有原始指针的协变 return 类型。所以下面的是可能的:
class ProgramNodeBase
{
public:
virtual FunctionBase* GetEdgeFunction(unsigned int position);
};
class ProgramNode : public ProgramNodeBase
{
public:
Function* GetEdgeFunction(unsigned int position) override;
};
为此,Function
的定义必须在声明覆盖程序的地方可用——编译器必须能够验证 return 类型实际上是协变的。
当然,您必须为覆盖程序提供适当的实现。
我是 C++ 的初学者,如果我的问题很愚蠢,请原谅。我有 4 个 classes:ProgramNodeBase
、ProgramNode
、FunctionBase
、Function
。 ProgramNode
派生自 ProgramNodeBase
,Function
派生自 FunctionBase
。 ProgramNodeBase
具有指向 FunctionBase
的指针向量和可以从中 return 项的方法。是否可以在派生 class ProgramNode
中以 return Function
而不是 FunctionBase
的方式覆盖此方法?我在这里查看了一些答案,但没有找到 return type derived.
我问是因为我有需要 Function
的方法,而这只能 return 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++ 支持具有原始指针的协变 return 类型。所以下面的是可能的:
class ProgramNodeBase
{
public:
virtual FunctionBase* GetEdgeFunction(unsigned int position);
};
class ProgramNode : public ProgramNodeBase
{
public:
Function* GetEdgeFunction(unsigned int position) override;
};
为此,Function
的定义必须在声明覆盖程序的地方可用——编译器必须能够验证 return 类型实际上是协变的。
当然,您必须为覆盖程序提供适当的实现。