我想知道父类的子类型。问题是我得到的父类是通过引用&从函数返回的。我无法解决它。以下是正在进行的代码片段的示例:
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?
}
由于
答案 0 :(得分:4)
当您将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。