使用static_cast来动态多态

Use static_cast to dynamic polymorphism

我用了static_cast来多态。 我读到我应该使用 dynamic_cast,但我不明白为什么。 代码以两种方式工作(静态和动态转换)。

任何人都可以给我一个必要的 dynamic_cast 运算符的例子吗?

class Base
{
    public:
    virtual void foo() = 0;
};

class D1 : public Base
{
    public:
    void foo()
    {
        std::cout << "D1()";   
    }
};

class D2 : public Base
{
    public:
    void foo()
    {
        std::cout << "D2()";   
    }
};


int main()
{
    srand( time( NULL ) );
    int r = std::rand()%2;

    Base* b_ptr;

    if(r == 0)
    {
        b_ptr = static_cast<Base*>(new D1);    
    }
    else
    {
          b_ptr = static_cast<Base*>(new D2);   
    }

    b_ptr->foo();
}

不知道你在哪看的。 至于 static_castdynamic_cast,那里有很多信息。 我在底部提供了几个链接。

为什么您的代码在这两种情况下都能正常工作?
"up-cast"(强制转换为基数 class)对于 static_castdynamic_cast 始终有效,并且没有任何强制转换,因为 "up-cast" 是隐式的转换。 (来自 here,例如)

谁能给我一个必要的 dynamic_cast 运算符的例子?
dynamic_cast 专门用于处理多态性。您可以将指向任何多态类型的指针或引用转换为任何其他 class 类型(多态类型至少有一个声明或继承的虚函数)。您不仅可以将它用于向下投掷 - 您还可以向侧面投掷,甚至可以向上投掷另一条链条。 dynamic_cast 将寻找所需的对象,并在可能的情况下 return 找到它。如果不能,它会在指针的情况下 return nullptr ,或者在引用的情况下抛出 std::bad_cast
不过,dynamic_cast 有一些限制。如果继承层次结构中有多个相同类型的对象(即所谓的 'dreaded diamond')并且您没有使用虚拟继承,则它不起作用。它也只能通过 public 继承——它总是无法通过受保护或私有继承。然而,这很少成为问题,因为这种形式的继承很少见。 (来自 here,例如)
有关示例,请参阅 this

奖励:当你不能使用dynamic_cast?
如果向下转换(转换为派生的 class)并且参数类型不是多态的,则不能使用 dynamic_cast

Regular cast vs. static_cast vs. dynamic_cast

When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?