我有一个键值容器类,它包含指向基类型的堆分配对象的指针。容器的插入方法实例化 2 个派生 类对象之一(基于运行时标志)并将其插入自身。
我有一个具有以下签名的 Find
方法:
bool Find(int key, Base *&result);
使用此容器的类知道实际上正在存储哪个派生类,因为在该类的用户和派生类型之一之间存在一对一的映射。
因此,当用户尝试按如下方式调用 Find 方法时:
DerivedA *a = nullptr;
bool found = container.Find(10, a);
我收到一个编译器错误,提示没有匹配的函数。
所以看起来基类和派生类之间没有发生隐式转换。我怀疑这与我通过引用传递指针这一事实有关,但我不确定。
什么是“正确”的方法来实现我在这里的目标?
谢谢!
最佳答案
I suspect it has to do with the fact that I'm passing the pointer by reference
假设 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 评论所建议的,返回指针可能更好。)
关于c++ - 通过引用将派生类指针传递给期望基指针的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42182877/