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

时间:2017-02-12 00:25:44

标签: c++ pointers reference

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

我有Find方法,其签名如下:

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

使用此容器的类知道哪个派生类实际正在存储,因为该类的用户与其中一个派生类型之间存在一对一的映射。 / p>

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

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

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

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

实现我在此之后的“正确”方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

  

我怀疑这与我通过引用

传递指针的事实有关

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

基本上问题是您可以指定

Base* basePtr = &derived;

但不是周围的方式。因此,如果Find方法的唯一保证是找到Base类型的实例,我们就不能只将指针指向DerivedA

如果您确实知道Base班级指针指向DerivedA,则可以考虑@piRSquared's solution

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

(返回指针可能会更好,因为 @juanchopanza 评论建议。)

答案 1 :(得分:0)

添加查找重载

 body.hide-cursor * {
     cursor: none;
 }

 document.body.className = 'hide-cursor';
 //or
 document.body.className = '';