1、static_cast(隱式類型轉換)—–>相關類型的轉換
static_cast用於非多態類型的轉換(靜態轉換),任何標準轉換都可以用它,但
它不能用於兩個不相關的類型進行轉換。
2、reinterpret_cast(強制類型轉換)
reinterpret_cast操作符用於將一種類型轉換爲另一種不同的類型。
3.const_cast(去const屬性的類型轉換)
const_cast最常用的用途就是刪除變量的const屬性,方便賦值。
4、dynamic_cast(動態類型轉換)——->適用於多態
dynamic_cast用於將一個父類對象的指針轉換爲子類對象的指針或引用(動態轉換)
向上轉型:子類對象指針->父類指針/引用(不需要轉換)
向下轉型:父類對象指針->子類指針/引用(用dynamic_cast轉型是安全的)
重點:轉換需要滿足以下條件:
1. dynamic_cast只能用於含有虛函數的類
2. dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回0
示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
struct A
{
A(int a)
:_a(a)
{}
virtual void fun()
{}
int _a;
};
struct B :public A
{
B(int a, int b)
:_b(b)
, A(a)
{}
int _b;
};
void Fun(A* pa)
{
//如何判斷pa綁定的對象是父類對象還是子類對象
B* pb1 = dynamic_cast<B*> (pa);//動態轉換
B* pb2 = reinterpret_cast<B*> (pa);//強制類型轉換
cout << pb1 << endl;
cout << pb2 << endl;
}
void Test()
{
A a1(1);//構造函數
//應該爲:先調構造函數使用4構造一個A類的對象,再使用這個臨時對象拷貝構造一個A類的對象a2.
//可以使用下面方式來構造一個A類類型的對象的條件是:
//①構造函數必須是單參的;
//②構造函數不能使用explict修飾,explict關鍵字防止隱式類型轉換
A a2 = 4; //(隱式類型轉換)編譯器對這個表達式做了優化,即就是隻調了A類的構造函數。
B bb(2,3);
Fun(&a1);//綁定父類對象
Fun(&bb);//綁定子類對象
}
int main()
{
Test();
return 0;
}
結果如下:
從上述結果可得:
當將綁定父類對象的指針轉換(強轉或者動態轉換)爲子類的指針時,動態轉換的子類指針結果爲空(0)。
而將綁定子類對象的指針轉換(強轉或動態轉換)爲子類的指針時,動態轉換的子類指針和強制類型轉換的結果相等且不爲0。