代码之家  ›  专栏  ›  技术社区  ›  Rajeshwar

为什么dynamic cast只适用于引用和指针

  •  0
  • Rajeshwar  · 技术社区  · 5 年前

    为什么动态强制转换只适用于指针和引用? 比如说我有这样的东西

    struct foo
    {
        virtual void test(){}
    };
    struct bar : public foo
    {
    };
    

    为什么这样的东西不管用

    foo* f = new bar();
    bar& b = dynamic_cast<bar>(*f); //Fail must be either pointer or reference
    

    现在假设 bar 确实为其母公司foo提供了转换构造函数。 我的问题是,为什么dynamic cast只接收指针和引用,而不接收像这样的简单对象 static_cast

    1 回复  |  直到 5 年前
        1
  •  4
  •   lubgr    5 年前

    dynamic_cast 只有一个目的:沿着继承层次结构进行强制转换,特别是向上和向下。让我们假设它适用于您的示例中的值,这里将发生什么:

    bar b{};
    
    auto sliced = dynamic_cast<foo>(b);
    

    物体 sliced 是一种 foo ,但只包含 子对象 b .这根本不是你想要的。按值处理多态类型的实例不是一个好选项,另请参见 this thread .

    对于相反的方向,更明显的是,为什么这不能很好地工作:

    bar b{};
    foo& f = b;
    
    // Pass f by value to dynamic_cast?! Then, the argument is already
    // sliced before the dynamic_cast is even able to determine its
    // runtime type.
    bar downcast = dynamic_cast<bar>(f);
    

    最后一个例子中的评论有点夸张,因为 动态投影 是一个运算符,而不是一个函数,但它应该指出这里的问题:跨层次结构的转换不能很好地处理值语义,以及 动态投影 反映了这一点。

        2
  •  1
  •   user6710094    5 年前

    当基类B和派生类D之间存在关系(继承)时,Dynamic cast可以工作。如果我们使用非引用和指针类型,这意味着我们正在转换它们,那么我们需要转换运算符,例如运算符B()或运算符B(),并返回所需的值。

    这里的情况不同:我们有一个对象,它有两个部分1。碱基类型2。仅特定于派生类型。 在这里,当我们使用指针或引用进行强制转换时,它只是将指针切换到正确的部分,从类型中我们知道它可以移动多少地址来访问元素(字段)。