我无法理解c样式转换之间的区别(例如: - A a; B*b; b =(*B)(&a);)和dynamic_cast <B*>(&a);

Sha*_*esh 1 c++

我在google上搜索了关于dynamic_cast的内容,我发现显式地转换基类对象来派生类指针可能不安全.但是,当我运行一些示例代码来检查这个时,我没有收到任何错误.请在下面找到我的代码:

class A
{
    virtual void get(){}
};

class B : public A
{
    public: void print(void)
    {
        cout << "In B's print" << endl;
    }
    void get()
    {
        cout <<" In B's get" << endl;
    } 
};

int main()
{
    A a;
    //A *a1 = &a;
    B* b;
    b = (B*)(&a);//c-style casting base class object to derive class pointer
    b->print();
    /*b = dynamic_cast<B*>(&a); // dynamic casting base class object to derive class pointer
    if(b)
            b->print();
    else
    cout << "failed" << endl;*/
}

Run: c++ cast.cpp
Run: ./a.out
o/p:- In B's print
Run Code Online (Sandbox Code Playgroud)

据我所知,b-> print()应该失败,因为基类没有关于派生类的所有信息.

如果我使用dynamic_cast运行相同的代码,它将在转换后返回null并且输出将失败.

有人可以清楚我的怀疑吗?如果有任何错误或不适当,请纠正我.

Som*_*ude 6

通过dynamic_cast运行时检查,您投射的内容确实可以转换为您想要的内容.

使用C风格的演员你基本上告诉编译器"我知道我在做什么,不要妨碍我".如果你犯了错误,这是一个很好的方式射击自己的脚.C风格的演员类似reinterpret_cast但不太安全.

在这种情况下,因为&a不是一个指针B,你确实拍摄自己的脚,因为该指针b将指向的东西,这不是一个B.如果您尝试以任何方式解除引用,则会导致未定义的行为b.