MSDN dynamic_cast static_cast const_cast reinterpret_cast

  • dynamic_cast  用于多态类型的转换

  • static_cast 用于非多态类型的转换

  • const_cast 用于移除 const, volatile, and__unaligned 属性.

  • reinterpret_cast 用于指针和类型间的相互转换

    // dynamic_cast_1.cpp
    // compile with: /c
    class B { };
    class C : public B { };
    class D : public C { };
    
    void f(D* pd) {
       C* pc = dynamic_cast<C*>(pd);   // ok: C is a direct base class
                                       // pc points to C subobject of pd 
       B* pb = dynamic_cast<B*>(pd);   // ok: B is an indirect base class
                                       // pb points to B subobject of pd
    }
    // dynamic_cast_2.cpp
    // compile with: /c /GR
    class A {virtual void f();};
    class B {virtual void f();};
    
    
    void f() {
       A* pa = new A;
       B* pb = new B;
       void* pv = dynamic_cast<void*>(pa);
       // pv now points to an object of type A
    
    
       pv = dynamic_cast<void*>(pb);
       // pv now points to an object of type B
    }
    
    
    
    
    // static_cast_Operator.cpp
    // compile with: /LD
    class B {};
    
    class D : public B {};
    
    void f(B* pb, D* pd) {
       D* pd2 = static_cast<D*>(pb);   // not safe, pb may
                                       // point to just B
    
       B* pb2 = static_cast<B*>(pd);   // safe conversion
    }
    
    
    
    
    // expre_const_cast_Operator.cpp
    // compile with: /EHsc
    #include <iostream>
    
    using namespace std;
    class CCTest {
    public:
       void setNumber( int );
       void printNumber() const;
    private:
       int number;
    };
    
    void CCTest::setNumber( int num ) { number = num; }
    
    void CCTest::printNumber() const {
       cout << "\nBefore: " << number;
       const_cast< CCTest * >( this )->number--;
       cout << "\nAfter: " << number;
    }
    
    int main() {
       CCTest X;
       X.setNumber( 8 );
       X.printNumber();
    }
    
    
    
    
    // expre_reinterpret_cast_Operator.cpp
    // compile with: /EHsc
    #include <iostream>
    
    // Returns a hash code based on an address
    unsigned short Hash( void *p ) {
       unsigned int val = reinterpret_cast<unsigned int>( p );
       return ( unsigned short )( val ^ (val >> 16));
    }
    
    using namespace std;
    int main() {
       int a[20];
       for ( int i = 0; i < 20; i++ )
          cout << Hash( a + i ) << endl;
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值