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

标签 c++ inheritance

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

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 *&'

最佳答案

您尝试做的事情的问题在于,如果它可以编译,那么函数 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 指向的对象。但是因为它是一个指针变量,所以它已经很清楚了,函数可以修改它。因此,只需删除 & 符号即可使您的代码按预期编译和工作:

void UT::setSpriteReelsSymbolBoundingBoxSize(Sprite* sprite);

关于c++ - 无法将参数 1 从派生指针转换为基类指针引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22757035/

相关文章:

c++ - 派生类模板中的条件覆盖

c++ - 获取 vector 的尾部?

c++ - 测试 MPI_Barrier C++

c++ - 将仅 header 库包含到多个文件中会产生链接器错误

c++ - "assert"是什么函数?

c++ - 除了 SetCursor 之外还有什么可以重置光标形状?

python - 理解 Python 中的元类和继承

c++ - 将基类的实例传递给派生类

c++ - 如何防止派生类成为 C++ 中的抽象类?

c++ - 如何向派生类添加功能?