C++中的四类强制转换?
生活随笔
收集整理的這篇文章主要介紹了
C++中的四类强制转换?
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C++中的四類強(qiáng)制轉(zhuǎn)換?
例:
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;
??
假設(shè)定義了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 ? 兩個(gè)無關(guān)類型指針之間的轉(zhuǎn)換 是不合法的
B ?通過void*這個(gè)媒介 ,合法
C ?直接賦值,無法進(jìn)行隱式轉(zhuǎn)換,不合法
D ?通過繼承體系中的一個(gè) 做媒介, 上行 下行 合法
解析2:
static_cast(編譯器可實(shí)現(xiàn)的隱式轉(zhuǎn)換或類層次間的下行轉(zhuǎn)換)、
dynamic_cast(操作數(shù)只能為類指針或類引用)、
const_cast(去除const)、
reinterpret_const(一般意義強(qiáng)制轉(zhuǎn)換)
經(jīng)測試,BD選項(xiàng)都可以通過編譯,然而B選項(xiàng)明顯不安全。?
? 如果想安全的將classB的指針轉(zhuǎn)換到classA的指針,需要將pB的值向前調(diào)整sizeof(ClassA)個(gè)大小。?
? D選項(xiàng)可以做的。但B選項(xiàng)通過Void直接把pB的值賦值給了pA2,并未進(jìn)行位置調(diào)整,所以說是不安全的。
例:
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;
??
假設(shè)定義了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 ? 兩個(gè)無關(guān)類型指針之間的轉(zhuǎn)換 是不合法的
B ?通過void*這個(gè)媒介 ,合法
C ?直接賦值,無法進(jìn)行隱式轉(zhuǎn)換,不合法
D ?通過繼承體系中的一個(gè) 做媒介, 上行 下行 合法
解析2:
static_cast(編譯器可實(shí)現(xiàn)的隱式轉(zhuǎn)換或類層次間的下行轉(zhuǎn)換)、
dynamic_cast(操作數(shù)只能為類指針或類引用)、
const_cast(去除const)、
reinterpret_const(一般意義強(qiáng)制轉(zhuǎn)換)
經(jīng)測試,BD選項(xiàng)都可以通過編譯,然而B選項(xiàng)明顯不安全。?
? 如果想安全的將classB的指針轉(zhuǎn)換到classA的指針,需要將pB的值向前調(diào)整sizeof(ClassA)個(gè)大小。?
? D選項(xiàng)可以做的。但B選項(xiàng)通過Void直接把pB的值賦值給了pA2,并未進(jìn)行位置調(diào)整,所以說是不安全的。
總結(jié)
以上是生活随笔為你收集整理的C++中的四类强制转换?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: x=x|(x+1);和x=x(x-1)?
- 下一篇: 神奇的traits