【问题标题】:Passing derived class pointer to function expecting base pointer by reference通过引用将派生类指针传递给期望基指针的函数
【发布时间】:2017-02-12 00:25:44
【问题描述】:

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

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

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

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

所以当用户尝试如下调用 Find 方法时:

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

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

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

什么是实现我在这里追求的“正确”方法?

谢谢!

【问题讨论】:

  • 为什么不直接返回一个指针呢? Base* Find(int key);
  • @juanchopanza 这实际上是一个好主意,但我仍然很想知道为什么上述方法不起作用
  • 你认为*& 是什么意思?
  • @Fureeish *& 表示对指针的引用。
  • @Fureeish 空引用是不允许的。对指针(包括空指针)的引用是可以的。

标签: c++ pointers reference


【解决方案1】:

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

假设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 评论所建议的那样。)

【讨论】:

  • 谢谢,现在很有意义。
【解决方案2】:

添加 Find 的重载

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

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 2019-09-16
    • 2012-12-26
    • 2023-04-07
    • 1970-01-01
    • 2010-12-24
    • 2016-10-06
    • 2017-11-12
    • 2023-03-22
    相关资源
    最近更新 更多