在特定情况下,static_cast和dynamic_cast的不同行为

different behavior of static_cast and dynamic_cast in a specific scenario

本文关键字:cast static 在特定情况下 dynamic      更新时间:2023-10-16

我在下面的方案中不弄清static_cast和dynamic_cast之间的真正差异:

                                **///with static_cast///**
    class Foo{};
    class Bar: public Foo
    {
        public:
          void func()
          {
            return;
          }
    };
    int main(int argc, char** argv)
    {
        Foo* f = new Foo;
        Bar* b = static_cast<Bar*>(f);
        b->func();
        return 0;
    }

输出:

成功构建和编译!

                                **///with dynamic_cast///**
    class Foo{};
    class Bar: public Foo
    {
        public:
          void func()
          {
            return;
          }
    };
    int main(int argc, char** argv)
    {
        Foo* f = new Foo;
        Bar* b = dynamic_cast<Bar*>(f);
        b->func();
        return 0;
    }

输出:

main.cpp:在函数'int main(int,char **(':main.cpp:26:34:错误: 无法dynamic_cast'f'(类型为'class foo*'(键入'class bar*' (源类型不是多态( bar* b = dynamic_cast(f(;

如果有人可以帮助我理解这一点!

,我将不胜感激

提示在零件中

(源类型不是多态(

这意味着要使dynamic_cast工作,它需要一个多态基类,即具有虚拟方法

class Foo {
public:
    virtual ~Foo() {}
};

除此之外,它将不起作用,因为f没有指向Bar对象。在这种情况下,dynamic_cast将返回NULLPTR,您必须检查

Foo* f = new Foo;
Bar* b = dynamic_cast<Bar*>(f);
if (b != nullptr)
    b->func();