无法将参数 1 从派生指针转换为基类指针引用

Posted

技术标签:

【中文标题】无法将参数 1 从派生指针转换为基类指针引用【英文标题】:Cannot convert parameter 1 from derived pointer to base class pointer reference 【发布时间】:2014-03-31 08:37:55 【问题描述】:

我有继承自基类的类, 然后我有方法,除了作为对基类的参数指针引用。 当我尝试将继承的对象传递给我得到的方法时:

c++ 无法将参数 1 从 'ReelSymbol *' 转换为 'Sprite *&'

Sprite 是框架基类

class ReelSymbol :public Sprite 

    public:
          ReelSymbol();
          ~ReelSymbol();

;

这是我尝试将 ReelSymbol 对象指针传递给的方法

void UT::setSpriteReelsSymbolBoundingBoxSize(Sprite* &sprite)

    //DOTO to think if to use scale or bounding box size
    sprite->setScale(pSettings->ReelSymbolScaleFactor);

像这样:

ReelSymbol* sprite = new ReelSymbol();
ut.setSpriteReelsSymbolBoundingBoxSize(sprite);

并收到此错误:

c++ cannot convert parameter 1 from 'ReelSymbol *' to ' Sprite *&'

【问题讨论】:

为什么不用指针引用?该方法正在改变精灵 真正的问题是,如果该函数不应该修改指针,为什么它通过引用获取指针,以及当它的名字说它与 ReelSymbol 一起使用时,为什么它需要 Sprite* . 【参考方案1】:

您尝试做的问题是,如果它可以编译,那么函数setSpriteReelsSymbolBoundingBoxSize 可以将您传递的变量重置为Sprite*,但不是ReelSymbol*

为了澄清,请考虑以下内容(并假装它会编译):

class NotAReelSymbol : public Sprite

;

void UT::setSpriteReelsSymbolBoundingBoxSize(Sprite* &sprite)

    sprite = new NotAReelSymbol;


ReelSymbol* sprite = new ReelSymbol();
ut.setSpriteReelsSymbolBoundingBoxSize(sprite);

现在,ReelSymbol* 类型的原始 sprite 变量的外观和行为应该是什么?这应该说明为什么您尝试编译的代码无效并且编译器正确拒绝编译它。

可能的解决方法是:

ReelSymbol* sprite = new ReelSymbol();
Sprite* sprite_base = sprite;
ut.setSpriteReelsSymbolBoundingBoxSize(sprite_base);

如果你能保证setSpriteReelsSymbolBoundingBoxSize 不会将原始变量重置为不是ReelSymbol*,那么之后你可以这样做

sprite = dynamic_cast<ReelSymbol*>(sprite_base);

但是,我发现您不需要重置原始变量的可能性更大。相反,通过将参数声明为引用,您试图表达允许该函数更改spirit 指向的对象。但是由于它是一个指针变量,因此函数可以修改它已经很清楚了。因此,只需删除 &amp;-symbol 即可使您的代码按预期编译和工作:

void UT::setSpriteReelsSymbolBoundingBoxSize(Sprite* sprite);

【讨论】:

或者方法可以改成Sprite* sprite,我看没必要实际传引用。 所以我错了,为什么我认为如果我想更改 Sprite 成员我需要将其作为引用指针传递?【参考方案2】:

这里唯一的问题是你的指针引用

Sprite* &sprite

没有必要让它成为一个引用,因为你已经有了指针。 像这样:

Sprite* sprite

您的编译器会自动将其转换为您所期望的基类“Sprite”

【讨论】:

以上是关于无法将参数 1 从派生指针转换为基类指针引用的主要内容,如果未能解决你的问题,请参考以下文章

向上强制转换和向下强制转换

Part7 继承与派生 7.3基类与派生类类型转换

C ++:将void *转换为基类指针时访问冲突

有没有办法在不知道派生类型的情况下将包含派生指针的 std::any 转换为基指针?

类型转换为基类后无法调用方法

派生类和基类的转换