青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

colorful

zc qq:1337220912

 

static_cast與dynamic_cast轉(zhuǎn)換

http://www.cnblogs.com/bastard/archive/2011/12/14/2288117.html

一 C語言中存在著兩種類型轉(zhuǎn)換:

隱式轉(zhuǎn)換和顯式轉(zhuǎn)換

隱式轉(zhuǎn)換:不同數(shù)據(jù)類型之間賦值和運(yùn)算,函數(shù)調(diào)用傳遞參數(shù)……編譯器完成

char ch;
int i = ch;

顯示轉(zhuǎn)換:在類型前增加 :(Type)變量 對(duì)變量進(jìn)行的轉(zhuǎn)換。用戶顯式增加

char *pc = (char*)pb;
void *ps = (void*)pa;


二 C++
中的類型轉(zhuǎn)換

  通過這兩種方式,C語言中大部分的類型轉(zhuǎn)換都可以順利進(jìn)行。

至于能不能進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換后的結(jié)果如何,編譯器不管需要用戶自己去控制。

  C++繼承了C中的隱式和顯式轉(zhuǎn)換的方式。但這種轉(zhuǎn)換并不是安全和嚴(yán)格的,

加上C++本身對(duì)象模型的復(fù)雜性,C++增加了四個(gè)顯示轉(zhuǎn)換的關(guān)鍵字。(C++是強(qiáng)類型語言)

static_castdynamic_castconst_staticreinterpret_cast


1 static_cast

(1)用于基本的數(shù)據(jù)類型轉(zhuǎn)換(char,int),及指針之間的轉(zhuǎn)換

復(fù)制代碼
test_enum type = test_enum_1;

char a ;
int b = static_cast<int>(a);
char c = static_cast<char>(b);
type = static_cast<test_enum>(b);

char* pa = NULL;
int *pb = (int*)pa;
//int *pb = static_cast<int*>(pa); //error
//pa = static_cast<char*>(pb) //error
char *pc = (char*)pb;
//char *pc = static_cast<char*>(pb); //error

void *p = static_cast<void*>(pa);
pb = static_cast<int*>(p);
pc = static_cast<char*>(p);
復(fù)制代碼


(2)類層次中基類與子類成員函數(shù)指針的轉(zhuǎn)換

 

復(fù)制代碼
class A
{

public:
void set(){}
};

class B:public A
{
public:
void set(){}
};

typedef void (A::*PS_MFunc)();   //指向類A的成員函數(shù)指針

PS_MFunc func = &A::set;
func = static_cast<PS_MFunc>(&B::set); //基類指向子類成員函數(shù)指針,必須進(jìn)行轉(zhuǎn)換
復(fù)制代碼


(3)類層次結(jié)構(gòu)中基類與子類指針或引用之間的轉(zhuǎn)換  

   上行轉(zhuǎn)換:子類指針或引用轉(zhuǎn)換成基類表示——安全

  下行轉(zhuǎn)換:基類指針或引用轉(zhuǎn)換成子類表示——危險(xiǎn)(沒有動(dòng)態(tài)類型檢查)

復(fù)制代碼
class A
{
};
class B:public A
{
};
class C:public A
{
};
class D
{
};

A objA;
B objB;
A* pObjA = new A();
B* pObjB = new B();
C* pObjC = new C();
D* pObjD = new D();

objA = static_cast<A&>(objB); //轉(zhuǎn)換為基類引用
objA = static_cast<A>(objB);

objB = static_cast<B>(objA); //error 不能進(jìn)行轉(zhuǎn)換

pObjA = pObjB; //right 基類指針指向子類對(duì)象
//objB = objA; //error 子類指針指向基類對(duì)象
pObjA = static_cast<A*>(pObjB); //right 基類指針指向子類
pObjB = static_cast<B*>(pObjA); //強(qiáng)制轉(zhuǎn)換 OK 基類到子類
//pObjC = static_cast<C*>(pObjB); //error 繼承于統(tǒng)一類的派生指針之間轉(zhuǎn)換
//pObjD = static_cast<D*>(pObjC); //error 兩個(gè)無關(guān)聯(lián)之間轉(zhuǎn)換
復(fù)制代碼


2 dynamic_cast

(1)繼承關(guān)系的類指針對(duì)象或引用之間轉(zhuǎn)換

        

復(fù)制代碼
class A
{
};
class B:public A
{
};
class C:public A
{
};
class D
{
};

A objA;
B objB;
A* pObjA = new A();
B* pObjB = new B();
C* pObjC = new C();
D* pObjD = new D();
//objA = dynamic_cast<A>(objB); //error 非引用

objA = dynamic_cast<A&>(objB);
//objB = dynamic_cast<B&>(objA); //error A 不是多態(tài)類型不能轉(zhuǎn)換 若有虛函數(shù)則可以進(jìn)行轉(zhuǎn)換

pObjA = dynamic_cast<A*>(pObjB);
//pObjB = dynamic_cast<B*>(pObjA); //error A 繼承關(guān)系 不是多態(tài)類型不能轉(zhuǎn)換
//pObjB = dynamic_cast<B*>(pObjC); //error C 兄弟關(guān)系 不是多態(tài)類型不能轉(zhuǎn)換
//pObjB = dynamic_cast<B*>(pObjD); //error D 沒有關(guān)系 不是多態(tài)類型不能轉(zhuǎn)換
復(fù)制代碼

 

 

(2)包含有虛函數(shù)之間對(duì)象指針的轉(zhuǎn)換   

復(fù)制代碼
class A
{
Public:
Virtual ~A(){}
};
class B:public A
{
};
class C:public A
{
};
class D
{
Public:
Virtual ~D(){}
};
pObjB = dynamic_cast<B*>(pObjA);    // worning 繼承關(guān)系 父類具有虛函數(shù) 多態(tài)
pObjB = dynamic_cast<B*>(pObjD); //worning 沒有關(guān)系 D是多態(tài)類型可以轉(zhuǎn)換
//以上結(jié)果:pObjB == NULL 此處會(huì)發(fā)生一個(gè)運(yùn)行時(shí)錯(cuò)誤
復(fù)制代碼

         也就是說除了基類指針指向子類對(duì)象,可以沒有虛函數(shù)外,其它要進(jìn)行dynamic_cast轉(zhuǎn)換必須具有虛函數(shù)才行。

那這是為什么呢?下面繼續(xù)>


(3)dynam_cast轉(zhuǎn)換的安全性

         dynamic_cast是動(dòng)態(tài)轉(zhuǎn)換,只有在基類指針轉(zhuǎn)換為子類指針時(shí)才有意義。

(子類指針轉(zhuǎn)換為基類指針本來就是可以的:基類指針指向子類對(duì)象OK)。

但是基類指針轉(zhuǎn)換為子類指針,并不是每一次都有效:只有基類指針本身指向的是一個(gè)派生類的對(duì)象,

然后將此基類指針轉(zhuǎn)換為對(duì)應(yīng)的派生類指針才是有效的。這種情況在表面上是無法判定的。此時(shí)dynamic就發(fā)揮了作用。

情況1: static_cast轉(zhuǎn)換       

復(fù)制代碼
class A
{
};
class B:public A
{
public:
int m; //B 成員
};


A* pObjA = new A();
B* pObjB = NULL;
pObjB = static_cast<B*>(pObjA); //基類指針轉(zhuǎn)化為子類指針 成功轉(zhuǎn)換
pObjB->m = 10;   //實(shí)際中pObj所指向的對(duì)象 是A類對(duì)象
//上面會(huì)發(fā)生什么呢,在VC6.0中正常運(yùn)行。。。?

//如果:

pObjB = dynamic_cast<B*>(pObjA); //error 基類A沒有虛函數(shù) 不構(gòu)成多態(tài)
復(fù)制代碼

情況2:     dynamic_cast轉(zhuǎn)換    

復(fù)制代碼
class A
{
public:
virtual ~A(){} //虛函數(shù) 多態(tài)
};

class B:public A
{
public:
int m;
};

A* pObjA = new A();
B* pObjB = NULL;
pObjB = dynamic_cast<B*>(pObjA); //編譯通過
//實(shí)際運(yùn)行結(jié)果:pObjB == NULL // dynamic_cast保證轉(zhuǎn)換無效 返回NULL
復(fù)制代碼

         dynamic_cast轉(zhuǎn)換不成功,則返回0

4 虛函數(shù)對(duì)于dynamic_cast轉(zhuǎn)換的作用

  為何使用dynamic_cast轉(zhuǎn)換類指針時(shí),需要虛函數(shù)呢。

Dynamic_cast轉(zhuǎn)換是在運(yùn)行時(shí)進(jìn)行轉(zhuǎn)換,運(yùn)行時(shí)轉(zhuǎn)換就需要知道類對(duì)象的信息(繼承關(guān)系等)。

如何在運(yùn)行時(shí)獲取到這個(gè)信息——虛函數(shù)表。

  C++對(duì)象模型中,對(duì)象實(shí)例最前面的就是虛函數(shù)表指針,

通過這個(gè)指針可以獲取到該類對(duì)象的所有虛函數(shù),包括父類的。

因?yàn)榕缮悤?huì)繼承基類的虛函數(shù)表,所以通過這個(gè)虛函數(shù)表,我們就可以知道該類對(duì)象的父類,在轉(zhuǎn)換的時(shí)候就可以用來判斷對(duì)象有無繼承關(guān)系。

  所以虛函數(shù)對(duì)于正確的基類指針轉(zhuǎn)換為子類指針是非常重要的。

posted on 2015-01-13 17:14 多彩人生 閱讀(383) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲男女毛片无遮挡| 亚洲日产国产精品| 亚洲欧美国产精品va在线观看| 亚洲人体一区| 欧美日韩午夜在线视频| 一二三四社区欧美黄| 日韩一级二级三级| 国产欧美日韩综合精品二区| 久久久久久9999| 欧美gay视频| 亚洲综合视频1区| 欧美一区免费| 91久久在线视频| 在线视频日韩精品| 狠狠色狠狠色综合日日五| 欧美国产精品一区| 欧美视频二区36p| 久久久成人精品| 欧美激情精品久久久| 亚洲男同1069视频| 久久影院亚洲| 亚洲免费在线电影| 久久蜜桃av一区精品变态类天堂| 亚洲毛片网站| 久久av红桃一区二区小说| 亚洲精品乱码| 欧美一区二区在线看| 99视频在线观看一区三区| 亚洲欧美精品伊人久久| 亚洲黄色成人网| 亚洲嫩草精品久久| 亚洲乱码国产乱码精品精可以看| 亚洲免费视频网站| 一本久久综合| 久久久久久久欧美精品| 午夜精品福利在线| 欧美国产大片| 久久五月激情| 国产精品亚洲а∨天堂免在线| 欧美黑人多人双交| 国产一区二区剧情av在线| 亚洲美女av网站| 在线精品亚洲| 久久国产福利国产秒拍| 亚洲影院在线观看| 欧美人与性动交α欧美精品济南到| 性xx色xx综合久久久xx| 欧美日韩免费看| 亚洲欧洲日本mm| 亚洲激情自拍| 久久躁狠狠躁夜夜爽| 久久爱www久久做| 国产精品高潮久久| 亚洲美女精品成人在线视频| 亚洲国产精品电影在线观看| 久久久www| 久久久久99| 国产一区日韩欧美| 亚洲欧美成人网| 午夜精品久久久99热福利| 欧美日韩一区二区欧美激情| 亚洲免费电影在线观看| 夜夜嗨av一区二区三区四季av| 美女精品一区| 欧美激情1区2区| 亚洲精品视频在线| 欧美激情视频一区二区三区免费| 亚洲高清不卡av| 日韩小视频在线观看专区| 欧美乱人伦中文字幕在线| 亚洲国内在线| 亚洲一区二区成人| 国产精品一区在线播放| 欧美一区永久视频免费观看| 久久免费视频观看| 亚洲成色最大综合在线| 免费一区二区三区| 亚洲精选视频免费看| 亚洲色图制服丝袜| 国产精品美女主播| 性做久久久久久久免费看| 久久免费精品视频| 亚洲日本在线视频观看| 欧美日韩视频在线观看一区二区三区| 日韩视频在线观看| 欧美一区二区三区精品| 亚洲电影免费观看高清| 欧美日本一区| 欧美一区二区三区视频免费播放| 久久久久99精品国产片| 亚洲欧洲精品一区二区三区 | 美日韩在线观看| 亚洲国产日韩在线| 欧美少妇一区| 久久国产精品99久久久久久老狼| 米奇777超碰欧美日韩亚洲| 亚洲欧洲在线视频| 国产精品久久久久永久免费观看| 欧美一区三区三区高中清蜜桃| 免费一级欧美在线大片| 亚洲图片欧美日产| 国内精品久久久久久| 欧美激情一区在线| 欧美在线www| 亚洲另类自拍| 可以看av的网站久久看| 中文一区在线| 亚洲国产精品一区在线观看不卡 | 欧美电影免费观看| 亚洲欧美日韩天堂| 亚洲黄色成人久久久| 久久国产主播| 亚洲视频精品| 91久久精品美女| 国产午夜精品全部视频在线播放| 蜜臀av一级做a爰片久久| 亚洲欧美一级二级三级| 亚洲日韩视频| 免费人成精品欧美精品| 先锋影音国产一区| 中文无字幕一区二区三区| 亚洲国产精品毛片| 韩国免费一区| 国产日本欧美视频| 欧美视频在线播放| 欧美精品v国产精品v日韩精品| 久久久国产一区二区| 亚洲一区二区在线看| 亚洲蜜桃精久久久久久久| 欧美激情中文不卡| 巨乳诱惑日韩免费av| 久久精品一区四区| 久久久7777| 午夜精品国产更新| 午夜欧美视频| 亚洲一级片在线观看| 9色精品在线| 亚洲精品在线免费| 日韩一级不卡| 一本大道久久a久久精二百| **网站欧美大片在线观看| 精品不卡一区二区三区| 一区二区三区在线观看欧美| 国产一区三区三区| 激情欧美日韩一区| 在线观看日韩| 亚洲日本va午夜在线影院| 亚洲精品一区二区三区在线观看 | 激情久久中文字幕| 1024亚洲| 99精品欧美一区二区三区综合在线| 亚洲精品国产精品国产自| 亚洲精品久久久久久下一站 | 欧美91视频| 欧美寡妇偷汉性猛交| 亚洲国产欧美一区| 一本色道久久88综合亚洲精品ⅰ| 日韩一区二区福利| 亚洲在线免费| 久久久国产视频91| 欧美成人精品一区二区| 欧美日韩网站| 国产美女精品视频| 在线播放中文一区| 一区二区三区免费观看| 午夜精品久久久久久久| 久久综合精品一区| 亚洲激情第一页| 亚洲一区自拍| 六月婷婷久久| 国产精品电影在线观看| 国产一区二区三区久久| 91久久在线观看| 亚洲欧美日韩国产中文在线| 久久亚洲精选| 一区二区免费看| 久久夜色精品国产欧美乱极品| 欧美日韩亚洲高清| 国产一区导航| 亚洲网站视频福利| 久久婷婷综合激情| 在线亚洲一区二区| 美女国内精品自产拍在线播放| 欧美三级电影一区| 在线成人av网站| 午夜激情一区| 亚洲精品欧美专区| 久久久久久久久久久一区| 欧美性色视频在线| 一区在线观看| 欧美在线视频a| 亚洲美女中文字幕| 久久一二三区| 国自产拍偷拍福利精品免费一| 夜夜精品视频| 欧美成人69| 久久精品成人欧美大片古装| 国产精品盗摄久久久| 亚洲乱码国产乱码精品精| 美腿丝袜亚洲色图|