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

时间:2018-08-30 08:55:53

标签: 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

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

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

有人可以消除我的疑问吗?如果有任何错误或不当之处,也请纠正我。

1 个答案:

答案 0 :(得分:6)

使用dynamic_cast,您将获得运行时检查,以确认您确实投射了 所投射的内容。

使用C风格的强制转换,您基本上会告诉编译器“我知道我在做什么,不要妨碍我”。如果您犯了一个错误,这是一个很好的射击方法。 C样式的强制转换类似于reinterpret_cast,但安全性较低。

在这种情况下,由于&a不是指向B的指针,所以您确实会朝自己开枪,因为指针b将是指向不是B的内容。如果您尝试以任何方式取消对b的引用,都会导致undefined behavior