C++中的四类强制转换?

来源:互联网 发布:服务器端 语言 python 编辑:程序博客网 时间:2024/06/03 21:03
C++中的四类强制转换?
例:
class ClassA

{

  public:

   virtual ~ ClassA()

 
   {
   
     }
   
 virtual void FunctionA()
   
     {
   
     }

};




class ClassB


{
  
  public:
  
  virtual void FunctionB()
 
   {
  
    }

};

class ClassC: public ClassA, public ClassB


{
  
  public:

};


ClassC aObject;
ClassA *pA = &aObject;
ClassB *pB = &aObject;
ClassC *pC = &aObject;
  
假设定义了ClassA* pA2,

下面正确的代码是:BD
A:pA2=static_cast<ClassA*>(pB);

B:void* pVoid=static_cast<void*>(pB);      pA2=static_cast<ClassA*>(pVoid);

C:pA2=pB;

D:pA2=static_cast<ClassA*>(static_cast<ClassC*>(pB));


解析1:
A   两个无关类型指针之间的转换 是不合法的
B  通过void*这个媒介 ,合法
C  直接赋值,无法进行隐式转换,不合法
D  通过继承体系中的一个 做媒介, 上行 下行 合法


解析2:
static_cast(编译器可实现的隐式转换或类层次间的下行转换)、
dynamic_cast(操作数只能为类指针或类引用)、
const_cast(去除const)、
reinterpret_const(一般意义强制转换)

经测试,BD选项都可以通过编译,然而B选项明显不安全。 
  如果想安全的将classB的指针转换到classA的指针,需要将pB的值向前调整sizeof(ClassA)个大小。 
  D选项可以做的。但B选项通过Void直接把pB的值赋值给了pA2,并未进行位置调整,所以说是不安全的。