通过引用将派生类指针传递给需要基指针的函数

Passing derived class pointer to function expecting base pointer by reference

本文关键字:指针 函数 引用 派生      更新时间:2023-10-16

我有一个键值容器类,它包含指向基类型的堆分配对象的指针。容器的 insert 方法实例化 2 个派生类对象之一(基于运行时标志(并将其插入到自身中。

我有一个具有以下签名的Find方法:

bool Find(int key, Base *&result);

使用此容器的类知道实际存储的是哪个派生类,因为类的用户和派生类型之一之间存在一对一的映射。

因此,当用户尝试调用 Find 方法时,如下所示:

DerivedA *a = nullptr;
bool found = container.Find(10, a);

我收到一个编译器错误,说没有匹配的函数。

因此,基类和派生类之间似乎没有发生隐式转换。我怀疑这与我通过引用传递指针的事实有关,但我不确定。

实现我在这里所追求的目标的"正确"方法是什么?

谢谢!

怀疑这与我通过引用传递指针的事实有关

想象一下,Find更新传递的指针,现在它指向Base的新实例。但是调用方仍然将其解释为指向DerivedA的指针。

基本上问题是你可以分配

Base* basePtr = &derived;

但不是这样。因此,如果您的Find方法的唯一保证是它找到Base类型的实例,我们不能只将指向它的指针分配给DerivedA

如果你知道你的Base类指针指向DerivedA,你可以考虑dynamic_cast

Base* Find(int key);
....
DerivedA* a = dynamic_cast<DerivedA*>(Find(key));

(正如@juanchopanza注释所建议的那样,返回指针可能会更好。

添加查找的重载

Base *pi=result;
bool r=Find(key,pi);
result=dynamic_cast<DerivedA *>(pi);
return r;