【问题标题】:error: no matching function for call to 'Subclass::...'错误:没有用于调用“子类::...”的匹配函数
【发布时间】:2019-09-25 01:33:25
【问题描述】:

我正在为学校做一个 OOP 项目,但由于以下问题,我目前陷入困境:

假设A 是我的基类,B 继承自 AC 继承自 B

A 有一个方法可以检查两个 A 类对象是否发生碰撞。

这个方法在C中没有被重新定义/过度驱动,但是我必须在这个子类中使用它。


class A 
{
  public:
    bool isColliding(A);
};

class B : public A 
{
};

class C : public B 
{
  public:
    void Eat(B);
}

void C::Eat(B objectB) 
{
  if(isColliding(objectB)) 
  {
  }
}

这是对代码的过度简化,我只是想传达这个想法。

它返回以下内容:

error : no matching function for call to 'C::isColliding(B)'
note: candidate: bool A::isColliding(A)
note: no known conversion for argument 1 from 'B' to 'A'.

如何让这种方法将 C 和 B 解释为 A 才能工作?

【问题讨论】:

  • 请提供minimal reproducible example。目前,您的代码无法编译,因为A::isColliding()Aprivate 方法。改成public后,编译就好了:wandbox.org/permlink/MXCCLmmb6dprMUFX
  • 错误消息的其余部分是否可能包含“在此上下文中是私有的”字样?
  • 谢谢,我忘了在我的帖子中指定它,但在我的代码中我公开了这些方法。我现在已经更新了。

标签: c++ class oop polymorphism


【解决方案1】:

要访问基类成员,您必须明确说明,如下所示:

if(A::isColliding(objectB)) {

【讨论】:

  • 我试图写if(A::isColliding(objectB)) {,但它仍然显示错误:没有匹配函数调用'C::isColliding(B)' 注意:候选:bool A::isColliding(A) 注意:没有已知的参数 1 从“B”到“A”的转换。
  • 这是因为A::isCollidingA 类型的对象作为它的参数,并且您传入B 类型的对象。也许您希望它获取A 类型对象的reference 并将reference 传递给B 类型的对象?由于继承,这将起作用。
  • 真正的代码比我写的要复杂一点。实际上,我有一个 B 对象上的指针列表,然后我使用 for (auto&) 循环对每个指针进行迭代,目的是检查指向的对象 B 是否与对象 C 发生碰撞。
  • 然后在我的最后一条评论中阅读 pointer 以获取 reference。这也是因为继承。
猜你喜欢
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 2012-12-28
  • 2015-03-31
  • 1970-01-01
相关资源
最近更新 更多