c++ - 在 C++ 中覆盖具有不同返回类型的方法

标签 c++ inheritance polymorphism covariance

<分区>

我是 C++ 的初学者,如果我的问题很愚蠢,请原谅。我有 4 个类:ProgramNodeBaseProgramNodeFunctionBaseFunctionProgramNode 派生自 ProgramNodeBaseFunction 派生自 FunctionBaseProgramNodeBase 具有指向 FunctionBase 的指针 vector 和可以从中返回项目的方法。是否可以在派生类 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 的定义必须在声明覆盖程序的地方可用——编译器必须能够验证返回类型实际上是协变的。

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

关于c++ - 在 C++ 中覆盖具有不同返回类型的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29541964/

相关文章:

c++ - 如何使用 boost::asio 为 UDP 发现和 TCP 连接序列化类

postgresql - 我可以在 PostgreSQL 中有一个父表的外键吗?

nhibernate - 使用 NHibernate 正确映射多态关系

ember.js - Ember 2 简单的多态关系

c++ - OpenGL "paint"程序

c++ - 每 8 位将 bitset<64> 转换为字符串

c++ - 哪个标准措辞告诉我们 ref-to-const 临时生命周期仅延长 "works once"?

java - spring数据中的多态查询

c++ - 如何定义没有中断的 STL 兼容输入迭代器?

c# - 为什么受约束的返回类型需要显式转换?