首页  >  问答  >  正文

c++ - static_cast的一个疑问

static_cast运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

来自:http://baike.baidu.com/link?u...

我想问下,加粗部分,它说的是什么意思?不安全指的是什么?

阿神阿神2665 天前794

全部回复(1)我来回复

  • 仅有的幸福

    仅有的幸福2017-06-05 11:13:51

    比如说有一个父类A,派生出两个子类BC,有一个A类指针或引用a指向了一个B类对象b,此时用static_cast进行下行转换,可以将其转换成C类的对象(指针或引用),此时就会出现不安全,因为C类的一些成员函数/变量对B类的对象不适用。
    简单来说,就是可以利用static_cast在同一父类的不同子类的对象之间互转,导致型别的错误。
    举个例子:

    class A {
    public:
        void function_A();
    };
    class B:public A {
    public:
        void function_B();
    };
    class C:public A {
    public:
        void function_C();
    };
    
    int main() {
        A* a;
        B b;
        a = &b;
        C* c = static_cast<C*>(a);  //cast合法
        c->function_C();            //此处会调用不存在的函数,
                                    //实际上c指向的是一个B类的对象
                                    //但是此处强行将其作为C类的对象解释
        return 0;
    }

    回复
    0
  • 取消回复