寫在前面
參考:鏈接
- static_cast
- const_cast
- reinterpret_cast
- dynamic_cast
static_cast
用於內置類型的轉換,以及有繼承關係的類之間的轉換。
說明:基類和派生類之間進行轉換時
- 向上轉換:派生類向基類進行轉換
- 向下轉換:基類向派生類進行轉換
#include<bits/stdc++.h>
using namespace std;
class A
{};
class B:public A
{};
class C
{};
int main()
{
A* a = new A;
B* b = new B;
C* c;
a=static_cast<A*>(b); // 編譯不會報錯, B類繼承A類,向上轉換
b=static_cast<B*>(a); // 編譯不會報錯, B類繼承A類,向下轉換
c=static_cast<C*>(a); // 編譯報錯(類型轉換無效), C類與A類沒有任何關係
return 0;
}
const_cast
用於同類型之間,將表達式轉換成常量
reinterpret_cast
將內置類型的數據轉換成其他類型的數據,也可以將指針轉化爲其他任何類型,或者將內置類型的數據轉換成指針,類似於C中的強制類型轉換 ,不到萬不得已不會使用。
dynamic_cast
- 上述三種類型的轉換髮生在程序編譯時,該轉換髮生在程序運行時。
- 主要用於基類和派生類之間的類型轉換。同時要求基類中必須有虛函數,否則編譯無法通過。
當向上轉換時:用法同static_cast;
當向下轉換時:dynamic_cast比static_cast更安全,要轉換的指針指向的對象的實際類型與轉換以後的對象類型一定要相同,否則轉換失敗。(如果基類指針指向的是派生類的對象,將該指針轉化成派生類的指針,能夠轉化成功;如果基類指針指向的是基類的對象,將該指針轉化成派生類的指針,返回值爲空。)
#include<iostream>
#include<cstring>
using namespace std;
class A
{
public:
virtual void f()
{
cout<<"hello"<<endl;
};
};
class B:public A
{
public:
void f()
{
cout<<"hello2"<<endl;
};
};
class C
{
void pp()
{
return;
}
};
int fun()
{
return 1;
}
int main()
{
A* a1=new B;//a1是A類型的指針指向一個B類型的對象
A* a2=new A;//a2是A類型的指針指向一個A類型的對象
B* b;
C* c;
b=dynamic_cast<B*>(a1);//結果爲not null,向下轉換成功,a1之前指向的就是B類型的對象,所以可以轉換成B類型的指針。
if(b==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
b=dynamic_cast<B*>(a2);//結果爲null,向下轉換失敗
if(b==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
c=dynamic_cast<C*>(a1);//結果爲null,向下轉換失敗
if(c==NULL)
{
cout<<"null"<<endl;
}
else
{
cout<<"not null"<<endl;
}
delete(a1);
return 0;
}
運行結果:
not null
null
null