C ++从基础到派生的无效转换[重复]

Posted

技术标签:

【中文标题】C ++从基础到派生的无效转换[重复]【英文标题】:C++ invalid conversion from base to derived [duplicate] 【发布时间】: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];" 【参考方案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 的对象,并因此返回指向第一个对象的指针。在您的回答中,代码将仅使用接收整数参数的构造函数分配一个元素。如您所见,这是一件非常不同的事情。

以上是关于C ++从基础到派生的无效转换[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++没有从字符串到const char *的可行转换* [重复]

C# - 错误的字符串到单一的转换[重复]

错误 1 error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 C:UsersAdminist

将具有无效字符的嵌套字段从 Spark 2 导出到 Parquet [重复]

为啥从指向基址的指针到指向派生的指针的静态转换“无效”?

从派生**到基础**的转换