【问题标题】: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,真的。

标签: c++ pointers casting


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2018-08-08
    • 2021-07-11
    相关资源
    最近更新 更多