【问题标题】:Not able to assign function, that takes derived class reference as parameter, to function pointer that takes base class reference as parameter无法将以派生类引用作为参数的函数分配给以基类引用作为参数的函数指针
【发布时间】:2021-03-08 14:37:09
【问题描述】:

您好,我正在尝试创建函数指针,它需要两个对基类的引用并为其分配函数,它需要两个对派生类的引用。

假设我已经创建了函数指针

typedef bool(*MOT_fptr)(const ColliderMesh::Mesh&, const ColliderMesh::Mesh&)

然后我有一个函数,它返回指向所选函数的函数指针

MOT_fptr GetMOT(ColliderMesh::Type type)
{
    switch (type) 
    {
        case ColliderMesh::Type::Rectangle: 
            return &Collider::BoxOverlapTest; // error: return value type does not match the function type

        case ColliderMesh::Type::Circle:  
            return &Collider::CircleOverlapTest; // error: return value type does not match the function type

        default: 
            return UNDEF_PTR; 
    }
}

函数BoxOverlapTestCircleOverlapTest 声明为

static bool BoxOverlapTest(const ColliderMesh::Rectangle& rect1, const ColliderMesh::Rectangle& rect2);
static bool CircleOverlapTest(const ColliderMesh::Circle& circ1, const ColliderMesh::Circle& circ2);

ColliderMesh::RectangleColliderMesh::Circle 都派生自基类 ColliderMesh::Mesh。但是当返回&Collider::BoxOverlapTest&Collider::Circle 时出现编译错误,上面写着return value type does not match the function type

所以问题是......这是否可能是我想要实现的目标,只是错过了一些东西,还是我应该寻找其他解决方案?

【问题讨论】:

    标签: function pointers polymorphism function-pointers return-type


    【解决方案1】:

    我解决了这个问题。当时我没有想到我可以将函数BoxOverlapTestCircleOverlapTest 参数声明为对基类Mesh 类的引用

    所以我将这些函数声明为

    static bool BoxOverlapTest(const ColliderMesh::Mesh& rect1, const ColliderMesh::Mesh& rect2);
    static bool CircleOverlapTest(const ColliderMesh::Mesh& circ1, const ColliderMesh::Mesh& circ2);
    

    然后当我调用我的函数并将参数传递给它时,我只是将它们显式转换为基类

    auto MOTFunction = Collider::GetMOT(col1MT);
    ... my code ...
    MOTFunction((ColliderMesh::Mesh)col1.m_Mesh[i], (ColliderMesh::Mesh)col2.m_Mesh[j]); // explicitly casting them
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 2020-08-02
      • 2016-06-16
      • 1970-01-01
      • 2014-04-18
      相关资源
      最近更新 更多