在c ++中使用不同的返回类型覆盖方法

时间:2015-04-09 14:56:07

标签: c++ inheritance polymorphism covariance

我是c ++的初学者,所以如果我的问题是愚蠢的,那就是借口。我有4个课程:ProgramNodeBaseProgramNodeFunctionBaseFunctionProgramNode ProgramNodeBase来自FunctionFunctionBase来自ProgramNodeBaseFunctionBase具有指向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() { } 所以当我想调用它时需要一些转换。是否有一些简单的方法来处理这个问题?

这只是我的代码片段,但它涵盖了我遇到的问题。我希望这个问题很清楚,而且不是很微不足道。

{{1}}

1 个答案:

答案 0 :(得分:6)

是的,C ++ 支持带有原始指针的协变返回类型。所以以下 是可能的:

class ProgramNodeBase
{
public:
  virtual FunctionBase* GetEdgeFunction(unsigned int position);
};


class ProgramNode : public ProgramNodeBase
{
public:
  Function* GetEdgeFunction(unsigned int position) override;
};

为了使其工作,Function的定义必须在声明覆盖的地方可用 - 编译器必须能够验证返回类型实际上是协变的。

当然,您必须为替补提供适当的实施。