c++ - 通过引用将派生类指针传递给期望基指针的函数

标签 c++ pointers reference

我有一个键值容器类,它包含指向基类型的堆分配对象的指针。容器的插入方法实例化 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/

相关文章:

c++ - QT:使用 move 语义将信号连接到插槽

c++ - 如何使用 gcc 工具检查 C++ 头文件是否正确?

C++ 在子类中更改父类

c++ - 为什么有些语言不允许声明指针?

python - 父类的引用 sibling

c++ - 访问以指针类型为键的 std::map

c++ - 创建虚函数的纯虚函数是否危险?

C++ 用非静态函数重载静态函数

c - 为什么段错误

C++对指针的引用