使用引用向下转换非指针

Posted

技术标签:

【中文标题】使用引用向下转换非指针【英文标题】:Downcasting a non pointer with reference 【发布时间】:2014-03-13 11:18:29 【问题描述】:

我想知道父类的子类型。问题是我得到的父类是通过引用&从函数返回的。我无法解决它。下面是一段代码示例:

class A : public B  ... 

B& getB()  return _b; 

main ()

    ...
    B aux = getB(); //this already gives me problems
    // ?? now what I have to do to know if B is a an A?

谢谢

【问题讨论】:

如果您需要帮助解决问题,您可能应该解释问题所在。不仅仅是“给我带来问题”。 你的问题毫无意义。 B 始终是 A。层次结构是这样的。 B 是 A。 @mkaes 看起来AB,真的。 【参考方案1】:

当您将aux 定义为B 时,它实际上将是B,即使getB 实际上返回了对A 的引用。这称为切片,几乎可以肯定不是您想要的;没有办法撤消它。

它发生的原因是你复制了getB的返回值。相反,如果您绑定了这样的引用

B& aux = getB();

那么aux 将简单地引用getB 返回的任何内容。如果您确定返回的引用getB 绑定到A,您可以使用static_cast<A&>(aux) 访问它的A 部分。如果你不确定,但如果你知道B至少有一个虚函数,你可以使用dynamic_cast<A&>(aux);如果失败会抛出异常。

也就是说,如果你有一个基类型的引用或指针,试图找出它秘密引用的派生类型通常是糟糕设计的标志。如果该值是您还不知道的类型,会发生什么?很有可能您想将此逻辑放入虚拟成员函数中,或者可能想要更多 union-like structure。

【讨论】:

以上是关于使用引用向下转换非指针的主要内容,如果未能解决你的问题,请参考以下文章

向量返回 const 引用,不可能向下转换

常见异常与引用数据类型转换

向下转换指向成员函数的指针

转换为C ++ CLI托管对象引用的本机指针?

我应该期望单继承中的向上转换和向下转换不会调整指针吗?

是否可以从父类指针向下转换为第二个子类中的子类指针?