使用引用向下转换非指针
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 看起来A
是B
,真的。
【参考方案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。
【讨论】:
以上是关于使用引用向下转换非指针的主要内容,如果未能解决你的问题,请参考以下文章