【问题标题】:C++ invalid conversion from base to derived [duplicate]C ++从基础到派生的无效转换[重复]
【发布时间】:2013-04-27 14:38:18
【问题描述】:

我有一个类Board,它包含一个指针数组,称为Space** bo,每个指针都指向Space 类的一个实例。我有一个名为SnakesAndLaddersSpace 的派生类,它继承自Space,而SnakesAndLaddersBoard 继承自Board

基本上,在我的SnakesAndLaddersBoard 类中,我想将它继承的Space** bo 更改为SnakesAndLaddersSpace** bo,我该怎么做?

这就是我在 SnakesAndLaddersBoard 类中所做的事情

SnakesAndLaddersBoard::Board::Board(int w, int h)
{ 
    width=w;
    height=h;//set up the size of the board

    bo = new SnakesAndLaddersSpace*[height];  // <<-- error
    for(int i = 0; i < height; i++)
    {
        bo[i] = new SnakesAndLaddersSpace[width]; 
    }
}

这是我遇到的错误

SnakesAndLaddersBoard.cpp|13|错误:从‘SnakesAndLaddersSpace*’到‘Space*’的无效转换[-fpermissive]|

【问题讨论】:

  • 在哪里你得到这个错误? 13号线是哪一行?而不是用文本描述你的代码,而是取而代之的是代码,尤其是所涉及的类/变量的声明和定义。
  • @JoachimPileborg,来吧,这只是 sn-p 中的一个点,这种转换只有 2 个候选者。
  • @Lol4t0 我们无法确定这是否是有问题的线路,所以安全总比抱歉好。
  • 如果有帮助,我把它放到了一个 pastebin 里,有很多代码,pastebin.com/pMW7RHkk 谢谢
  • 这一行是有问题的行 "bo = new SnakesAndLaddersSpace*[height];"

标签: c++ inheritance


【解决方案1】:

那是因为SnakesAndLaddersSpace**Space** 不兼容,它们只是由于间接级别太高而无关。 当然,您仍然可以将指向SnakesAndLaddersSpace 的指针分配给指向Space 类型的指针,但不能将指向SnakesAndLaddersSpace 的指针分配给指向Space 的指针。

bo = new Space*[height]; // look here!!!
for(int i = 0; i < height; i++)
{
    bo[i] = new SnakesAndLaddersSpace[width];
}

【讨论】:

  • 谢谢,这似乎解决了问题,但我现在唯一遇到的另一个问题是我似乎无法调用 SnakesAndLaddersSpace 中的方法,如下pastebin.com/QQtfUp5W跨度>
  • @user2327041,你不能从基类调用派生类中声明的函数。一般情况下,可以在基类中声明纯虚函数,在派生类中实现,但是这里看起来不太合理。否则,您可以使用static_cast 将基类转换为派生类,如果您确定,指向基类的指针包含指向派生类的指针。或者,您可能应该重新考虑您的架构以获得明确的解决方案。
【解决方案2】:

这没有意义...如果您正在创建一个新变量,那么您不应该调用构造函数吗? bo[i]= new SnakesAndLaddersSpace(width); ..?

【讨论】:

  • 不,在这种情况下,OP 正在分配 width 类型为 SnakesAndLaddersSpace 的对象,并因此返回指向第一个对象的指针。在您的回答中,代码将仅使用接收整数参数的构造函数分配一个元素。如您所见,这是一件非常不同的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多