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

隨筆 - 25  文章 - 29  trackbacks - 0
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(4)

隨筆分類(22)

隨筆檔案(25)

文章分類(2)

文章檔案(2)

相冊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 57075
  • 排名 - 405

最新評論

閱讀排行榜

評論排行榜


一???????????????? dynamic_cast
< type-id > ( expression )
? type-id :必須是指針或者引用
? expression:必須是指針或者一個左值
基本上是用來做 子對象間的轉(zhuǎn)換
1.基本的用法
class B { ... };
class C : public B { ... };
class D : public C { ... };

void f(D* pd)
{
   C* pc = dynamic_cast<C*>(pd);   // ok: C is a direct base class
                                 // pc points to C subobject of pd 

   B* pb = dynamic_cast<B*>(pd);   // ok: B is an indirect base class
                                 // pb points to B subobject of pd 
   ...
}

This type of conversion is called an "upcast" because it moves a pointer up a class hierarchy, from a derived class to a class it is derived from. An upcast is an implicit conversion.

If type-id is void*, a run-time check is made to determine the actual type of expression. The result is a pointer to the complete object pointed to by expression. For example:

class A { ... };

class B { ... };

void f()
{
   A* pa = new A;
   B* pb = new B;
   void* pv = dynamic_cast<void*>(pa);
   // pv now points to an object of type A
   ...
   pv = dynamic_cast<void*>(pb);
   // pv now points to an object of type B
}

If type-id is not void*, a run-time check is made to see if the object pointed to by expression can be converted to the type pointed to by type-id.

If the type of expression is a base class of the type of type-id, a run-time check is made to see if expression actually points to a complete object of the type of type-id. If this is true, the result is a pointer to a complete object of the type of type-id. For example:

class B { ... };
class D : public B { ... };

void f()
{
   B* pb = new D;                     // unclear but ok
   B* pb2 = new B;

   D* pd = dynamic_cast<D*>(pb);      // ok: pb actually points to a D
   ...
   D* pd2 = dynamic_cast<D*>(pb2);   // pb2 points to a B not a D
                                    // cast was bad so pd2 == NULL
   ...
}

This type of conversion is called a "downcast" because it moves a pointer down a class hierarchy, from a given class to a class derived from it.
小結(jié):
? a???? 實際指向?qū)ο?和?? b 目標對象,? b 是a 的 基類(子對象),或者是2者 同級轉(zhuǎn)換才成功
否則 目標為NULL;也就是說不能向下轉(zhuǎn)



2?? 多重非虛的繼承模式

Class Hierarchy Showing Multiple Inheritance

A pointer to an object of type D can be safely cast to B or C. However, if D is cast to point to an A object, which instance of A would result? This would result in an ambiguous casting error. To get around this problem, you can perform two unambiguous casts. For example:

void f()
{
   D* pd = new D;
   A* pa = dynamic_cast<A*>(pd);      // error: ambiguous
   B* pb = dynamic_cast<B*>(pd);      // first cast to B
   A* pa2 = dynamic_cast<A*>(pb);   // ok: unambiguous
}

Further ambiguities can be introduced when you use virtual base classes. Consider the class hierarchy shown in the following figure.

??? 也就是說在2意性下會失敗
3.子對象間的轉(zhuǎn)換

Class Hierarchy Showing Duplicate Base Classes


????//pd 指向 e 對象
void f(D* pd)
{
?? E* pe = dynamic_cast<E*>(pd);
?? B* pb = pe;????? // upcast, implicit conversion
?? A* pa = pb;????? // upcast, implicit conversion
}

//pd 指向 e 對象
void f(D* pd)
{
?? B* pb = dynamic_cast<B*>(pd);????? // cross cast
?? A* pa = pb;????????????????? // upcast, implicit conversion
}

? 也就是? 所謂 cross cast

二? typeid( type-id )???? typeid( expression )?
?? 此操作符返回個? const type_info &?
??????????? expression?必須指向一個多態(tài)類型(帶虛函數(shù)??? ),并且要解引用

#include <iostream>
#include <typeinfo.h>

class Base {
public:
?? virtual void vvfunc() {}
};

class Derived : public Base {};

using namespace std;
int main()
{
?? Derived* pd = new Derived;
?? Base* pb = pd;
?? cout << typeid( pb ).name() << endl;?? //prints "class Base *"
?? cout << typeid( *pb ).name() << endl;?? //prints "class Derived"
?? cout << typeid( pd ).name() << endl;?? //prints "class Derived *"
?? cout << typeid( *pd ).name() << endl;?? //prints "class Derived"
?? delete pd;
}
// compile with: /GR /EHsc

在模版中使用
template < typename T > T max( T arg1, T arg2 ) {
?? cout << typeid( T ).name() << "s compared." << endl;
?? return ( arg1 > arg2 ? arg1 : arg2 );
}


???????????

posted on 2006-07-04 10:23 黃大仙 閱讀(1366) 評論(2)  編輯 收藏 引用 所屬分類: c++

FeedBack:
# re: Run time type Information 2006-07-04 14:53 沐楓
好。
還不知道dynamic_cast<void*>()能轉(zhuǎn)換成真實類型的指針。有這個功能,真太好了。
等C++0x出來后,就可以用:
auto pv = dynamic_cast<void*>(...)來獲取真實類型了。  回復  更多評論
  
# re: Run time type Information 2006-07-08 00:27 flyingxu
雖然是很好的文章,但是文章前面一部分和msnd上的太像了。。。可以多加些自己的理解  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              在线观看91精品国产入口| 日韩视频在线一区| 亚洲国产精品第一区二区三区| 美女爽到呻吟久久久久| 狠狠爱综合网| 好吊妞这里只有精品| 好吊视频一区二区三区四区| 国产亚洲欧洲| 亚洲电影免费在线观看| 99国产精品视频免费观看| 中文国产一区| 久久国产日韩| 亚洲国产成人av好男人在线观看| 欧美激情视频网站| 中文高清一区| 久久久精品国产一区二区三区 | 性做久久久久久免费观看欧美| 亚洲一区自拍| 玖玖在线精品| 制服丝袜亚洲播放| 久久字幕精品一区| 欧美午夜片在线观看| 国内自拍视频一区二区三区| 亚洲精品一区二区三区在线观看| 亚洲午夜精品在线| 女生裸体视频一区二区三区| 一区二区三区日韩精品| 久久三级视频| 国产精品午夜在线观看| 91久久久久久国产精品| 亚洲欧美日韩在线播放| 欧美wwwwww| 亚洲欧美日韩另类| 欧美精品乱码久久久久久按摩 | 99re国产精品| 久久亚洲影音av资源网| 在线亚洲高清视频| 欧美成人免费va影院高清| 国产亚洲精品久久飘花| 亚洲在线电影| 亚洲精品视频免费观看| 久热这里只精品99re8久| 国产精品亚洲视频| 一区二区三区成人精品| 欧美jizz19性欧美| 欧美一区二区三区在线免费观看| 欧美日韩国产一区精品一区| 黄色日韩精品| 久久精品观看| 午夜在线精品偷拍| 国产精品毛片高清在线完整版| 99国产精品久久久| 亚洲欧洲精品一区二区| 蜜桃精品一区二区三区| 激情国产一区| 久久亚洲春色中文字幕| 久久不射电影网| 狠狠色丁香婷婷综合| 狠狠爱www人成狠狠爱综合网| 欧美人与性禽动交情品 | 亚洲视频免费| 亚洲精品一区二区三区四区高清| 欧美大片网址| 亚洲肉体裸体xxxx137| 欧美黄色精品| 欧美二区在线播放| 一区二区日韩伦理片| 91久久香蕉国产日韩欧美9色| 欧美成人在线网站| 99精品热视频只有精品10| 亚洲黄色成人久久久| 欧美国产综合视频| 一本色道久久| 中文av一区特黄| 国产欧美日韩视频一区二区三区 | 极品少妇一区二区| 美女主播视频一区| 欧美.www| 亚洲一级影院| 欧美一区二区三区四区视频| 狠狠色狠狠色综合日日91app| 欧美国产日产韩国视频| 欧美精品亚洲精品| 一区二区三区四区蜜桃| 亚洲自拍三区| 国内精品视频在线观看| 亚洲第一免费播放区| 欧美日韩视频在线一区二区观看视频| 亚洲午夜精品17c| 亚洲欧美日韩人成在线播放| 激情综合久久| 一级日韩一区在线观看| 国产日韩欧美精品在线| 欧美大片91| 欧美午夜一区二区| 美女主播精品视频一二三四| 欧美日韩精品免费观看视一区二区 | 亚洲国产三级网| 国产精品入口66mio| 欧美福利一区二区| 国产在线拍偷自揄拍精品| 欧美成人久久| 国产精品久久久久久亚洲调教| 欧美在线观看视频在线| 欧美激情无毛| 久久色在线观看| 欧美人妖在线观看| 久久野战av| 久久精品国产亚洲5555| 久久久久女教师免费一区| 欧美网站大全在线观看| 亚洲精品一区二区在线| 亚洲嫩草精品久久| 99re6这里只有精品| 久久久久久欧美| 欧美在线视频免费| 国产精品第三页| 日韩一区二区精品葵司在线| 亚洲福利视频在线| 欧美一二区视频| 亚洲欧美日本伦理| 欧美日韩你懂的| 亚洲电影免费| 亚洲精品国产精品国自产在线| 久久精品女人天堂| 久久久亚洲一区| 国产日韩精品在线播放| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 欧美福利一区| 亚洲国产成人精品久久| 在线观看欧美一区| 久久精品国产77777蜜臀| 欧美在线播放| 国产精品一区二区三区四区五区| 99日韩精品| 亚洲视频在线二区| 欧美日韩亚洲一区二| 韩日视频一区| 欧美一区亚洲一区| 久久夜精品va视频免费观看| 韩国v欧美v日本v亚洲v| 欧美一区二区三区在线观看| 午夜精品亚洲| 国产色婷婷国产综合在线理论片a| 一区二区久久| 性色av香蕉一区二区| 国产日韩欧美精品综合| 欧美一区二区大片| 久久久久欧美精品| 亚洲成色www8888| 免费国产一区二区| 亚洲黄色av| 午夜精品福利在线观看| 国产精品一区久久久久| 欧美一区二区精美| 欧美电影免费观看高清| 亚洲日韩成人| 国产精品久久久久一区二区三区 | 久久中文精品| 亚洲欧洲日本mm| 欧美日韩亚洲一区二区三区四区| 亚洲视频1区| 久久偷窥视频| 99国产精品视频免费观看| 国产精品日产欧美久久久久| 久久国产精品电影| 亚洲破处大片| 欧美在线啊v| 亚洲欧洲另类国产综合| 国产精品国产三级国产普通话三级 | 欧美日韩综合精品| 亚洲欧美一区二区三区在线| 久久久亚洲欧洲日产国码αv| 亚洲精品久久在线| 国产精品一级二级三级| 久久精品国产亚洲aⅴ| 亚洲国产美女久久久久| 欧美亚洲日本网站| 91久久精品一区二区别| 国产精品亚洲片夜色在线| 欧美成人午夜剧场免费观看| 亚洲免费在线| 日韩亚洲精品在线| 你懂的视频一区二区| 欧美一区二区三区在线播放| 亚洲精选91| 亚洲国产免费看| 久久riav二区三区| 91久久精品国产| 国产精品视频免费一区| 牛人盗摄一区二区三区视频| 亚洲在线一区| 亚洲经典视频在线观看| 久久精品亚洲| 亚洲欧美视频| 亚洲一区二区精品在线观看| 亚洲激情成人在线| 精品va天堂亚洲国产| 国产欧美va欧美不卡在线| 国产精品av久久久久久麻豆网|