C++类型转换

2014-12-28  本文已影响196人  CapJon

隐式类型转换:

C++的隐式转换发生在以下四种情况:


显式类型转换:


1. static_cast

// 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);   // Down
                                   // Not safe, D can have fields
                                   // and methods that are not in B.

   B* pb2 = static_cast<B*>(pd);   // Up
                                   // Safe conversion, D always contains all of B.
}

2. dynamic_cast

// static_cast_Operator_2.cpp
// compile with: /LD /GR
class B {
public:
   virtual void Test(){}
};
class D : public B {};

void f(B* pb) {
   D* pd1 = dynamic_cast<D*>(pb);
   D* pd2 = static_cast<D*>(pb);
}

3. reinpreter_cast


4. const_cast


关于多态的类指针转换

见下面这个例子:

class A {
 public:
   A() {
     a = 0;
   }
 private:
   int a;
};

class B : public A {
 public:
   B() {
     b = 0;
   }
 private:
   int b;
};
int main() {
  A *pa1, *pa2, *pa3, *pa4;
  B *pb1, *pb2, *pb3;

  A a1;
  pa1 = &a1;
  B b1;
  pb1 = &b1;
  
  // 首先,对于指针直接指向对象:
  pa2 = &b1;  // Correct 指针pa直接指向B中A有的一部分
  pb2 = &a1;  // Error 需要进行强制类型转换来缩小pb指针的范围
              // error: invalid conversion from 'A*' to 'B*'

  // 指针之间的转换
  pa3 = dynamic_cast<A*>(pb3);  // Up Correct 见上,使得指针能够正常工作
  pb3 = dynamic_cast<B*>(pa4);  // Down Error
  // error: cannot dynamic_cast 'pa4' (of type 'class A*') to type 'class B*' (source type is not polymorphic)
  // 由于类A不是虚基类,不能将其指针pa转换为类B的指针,因为类B的指针能够对A中没有的内容进行操作,直接转换则不能做到。若A为虚基类,B是对A中方法的重写,则能够正确转换

  return 0;
}

例子:

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
}
class B {virtual void f();};
class D : public B {virtual void f();};

void f() {
   B* pb = new D;   // unclear but ok
   B* pb2 = new B;

   D* pd = dynamic_cast<D*>(pb);   // ok: pb actually points to a D
   D* pd2 = dynamic_cast<D*>(pb2);   // pb2 points to a B not a D
}

参考阅读

static_cast, dynamic_cast, const_cast探讨
static_cast 运算符
dynamic_cast 运算符

上一篇 下一篇

猜你喜欢

热点阅读