C++中的四类强制转换?
生活随笔
收集整理的這篇文章主要介紹了
C++中的四类强制转换?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C++中的四類強制轉換?
例:
class 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,并未進行位置調整,所以說是不安全的。
例:
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,并未進行位置調整,所以說是不安全的。
總結
以上是生活随笔為你收集整理的C++中的四类强制转换?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: x=x|(x+1);和x=x(x-1)?
- 下一篇: s3c2440移植MQTT