一搁胆、dynamic_cast<T>(exp)
用于運(yùn)行時(shí)檢查該轉(zhuǎn)換是否類(lèi)型安全
基類(lèi)指針或引用向子類(lèi)轉(zhuǎn)換
只能操作指針或者引用 健爬。
將基類(lèi)指針向派生類(lèi)指針轉(zhuǎn)換,失敗返回nullptr
绊含,成功返回對(duì)象缤谎。
如果是引用,轉(zhuǎn)型失敗拋異常篡撵。
類(lèi)中必須要有一個(gè)虛函數(shù)判莉,應(yīng)該是dynamic_cast
會(huì)用虛函數(shù),或虛函數(shù)表育谬。
說(shuō)是用RTTI來(lái)判斷券盅。
RTTI
RTTI(Run-Time Type Information),通過(guò)運(yùn)行時(shí)類(lèi)型信息程序能夠使用基類(lèi)的指針或引用來(lái)檢查這些指針或引用所指的對(duì)象的實(shí)際派生類(lèi)型膛檀。
二锰镀、static_cast<T>(exp)
最常用的類(lèi)型轉(zhuǎn)換
非指針和引用類(lèi)型
int與float之間等
指針之間
可以將基類(lèi)類(lèi)型的指針轉(zhuǎn)向派生類(lèi),而且調(diào)用派生類(lèi)的函數(shù)咖刃。即使這個(gè)指針指向的是基類(lèi)類(lèi)型泳炉。
指針之間 的轉(zhuǎn)換必須得是繼承的關(guān)系。沒(méi)有任何關(guān)系的指針之間不能轉(zhuǎn)換
他可以將指向基類(lèi)的指針轉(zhuǎn)換為指向派生類(lèi)的指針而且能夠調(diào)用派生類(lèi)的成員函數(shù)嚎杨。
class A
{
public:
virtual void say();
};
class B :public A
{
public:
virtual void say();
void say1();
int i;
std::string ii;
};
int main()
{
A *a=new A;
std::cout<<"Aa "<<a<<" sizeof "<<sizeof(*a)<<std::endl;
B *b=static_cast<B*>(a);
std::cout<<"Bb "<<a<<" sizeof "<<sizeof(*b)<<std::endl;
b->say1();
b->say();
std::cout<<"b.i "<<b->i<<std::endl;
}
輸出
從輸出來(lái)看花鹅,指針相同,但是大小不同枫浙∨偎啵可以看出應(yīng)該是擴(kuò)充出來(lái)的古拴。
從執(zhí)行的函數(shù)來(lái)看,如果基類(lèi)有這個(gè)函數(shù)真友,就執(zhí)行基類(lèi)的黄痪。否則執(zhí)行轉(zhuǎn)型類(lèi)的。
但是盔然,從B的i的值可以看出满力,類(lèi)并沒(méi)有初始化。即使在默認(rèn)構(gòu)造函數(shù)中賦值轻纪,也不會(huì)初始化。
如果類(lèi)B內(nèi)叠纷,有必須要初始化的變量刻帚,比如const
之類(lèi)的,編譯器會(huì)報(bào)錯(cuò)涩嚣。
不知道崇众,為什么能這樣。
同時(shí)也可以增加變量的常量性
const_cast<T>(exp)
去除變量的const
const B * const b=new B;
std::cout<<"b.i "<<b->i<<" size "<<sizeof(*b)<<std::endl;
std::cout<<"b p "<<b<<std::endl;
B *c=const_cast<B*>(b);
c->i=2;
std::cout<<"change"<<std::endl;
std::cout<<"b.i "<<b->i<<" size "<<sizeof(*b)<<std::endl;
std::cout<<"b p "<<b<<std::endl;
輸出
從輸出來(lái)看航厚,確實(shí)是修改了顷歌。而且確實(shí)是在原來(lái)對(duì)象上修改的。
reinterpret_cast<t>(exp)
重新解釋
int i1(0);
int i(0);
std::cout<<"int i size "<<sizeof(i)<<" piont "<<&i<<std::endl;
std::cout<<"int i1 size "<<sizeof(i)<<" piont "<<&i1<<std::endl;
double *c=reinterpret_cast<double *>(&i);
std::cout<<"double c size "<<sizeof(*c)<<" piont "<<c<<std::endl;
std::cout<<"c "<<*c<<std::endl;
輸出
取后者大小的地址幔睬,對(duì)其進(jìn)行重新解釋眯漩。
implicit_cast<>()
這是boost庫(kù)中的轉(zhuǎn)型。yu