使用引用向下转换非指针

时间:2014-03-13 11:18:30

标签: c++ pointers casting

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

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?
}

由于

1 个答案:

答案 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