首页 > 解决方案 > dynamic_cast 以意想不到的方式成功

问题描述

我正在玩dynamic_cast以了解它的用法并想出了下面提供的代码。我曾经相信dynamic_cast<D*>(B*)成功当且仅当:

但是在下面的代码中BaseNonDerived类与上述方式无关,仍然dynamic_cast<NonDerived*>(Base*)成功。我原以为它会失败并返回 a NULL。哪条 C++ 规则在这里生效?

我正在使用符合 C++11 的编译器。

#include <iostream>

class Base {
    public:
        virtual ~Base() = default;
};

class Derived: public Base {
    public:
        void DerivedFun(){
            std::cout << "Derived" << std::endl;
        }
};

class NonDerived{
    public:
        void NonDerivedFun(){
            std::cout << "NonDerived" << std::endl;
        }
};

int main(){
    Base *pb = new Derived();

    Derived *pd = dynamic_cast<Derived*>(pb); // Expected this to succeed and it did
    pd->DerivedFun(); // Prints "Derived" as expected

    NonDerived *pn = dynamic_cast<NonDerived*>(pb); // Expected it to fail but it succeeded?
    pn->NonDerivedFun(); // Prints "NonDerived", expected this to throw some null pointer exception!!

    delete pb;
    return 0;
}

标签: c++c++11dynamic-cast

解决方案


pn->NonDerivedFun(); // 打印“NonDerived”,预计这会抛出一些空指针异常!!

取消引用空指针时,没有“空指针异常”之类的东西。这样做是未定义的行为。为避免在这种情况下发生这种情况,您必须检查是否dynamic_cast成功:

if (pn != nullptr) {
    pn->NonDerivedFun();
}

推荐阅读