在 c++ 中具有不同返回类型的重写方法

Override method with different return type in c++

本文关键字:返回类型 重写 方法 c++      更新时间:2023-10-16

我是 c++ 的初学者,所以如果我的问题很愚蠢,请原谅。我有4个班级:ProgramNodeBaseProgramNodeFunctionBaseFunctionProgramNode源于ProgramNodeBaseFunction源于FunctionBaseProgramNodeBase具有指向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的定义必须在声明覆盖器的位置可用 - 编译器必须能够验证返回类型是否实际上是协变的。

当然,您必须为覆盖程序提供适当的实现。