亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++ 中RTTI的使用方法詳解

2020-01-26 13:55:55
字體:
來源:轉載
供稿:網友

C++ 中RTTI的使用方法詳解

RTTI是運行階段類型識別(Runtime Type Identification)的簡稱。這是新添加到c++中的特性之一,很多老式實現不支持。另一些實現可能包含開關RTTI的編譯器設置。RTTI旨在為程序在運行階段確定對象類型提供一種標準方式。很多類庫已經成為其父類對象提供了實現這種方式的功能。但由于c++內部并不支持,因此各個廠商的機制通常互不兼容。創建一種RTTI語言標準將使得未來的庫能夠彼此兼容。

c++有3個支持RTTI的元素

如果可能的話,dynamic_cast 運算符將使用一個指向基類的指針來生成一個指向派生類的指針;否則,該運算符返回0――空指針

typied運算符返回一個指出對象的類型的值

type_info結構存儲了有關特定類型的信息

假設我們有下面的類層次結構:

class Grand{ //has virtual methods};class Super:public Grand {...}class Magnificent : public Superb{...}

假設有下面的指針:

Grand *pg = new Grand ;Grand *ps = new Superd;Grand *pm = new Manificent;

1、dynamic_cast

我們來看一下dynamic_cast的語法,該語法用法如下,其中pg指向一個對象

Superb pm = dynamic_cast< Superb > (pg) ; 

這樣 指針 pg 如果可以安全的轉換為Superb * 則返回對象地址,否則返回一個空指針。

示例:

// test1002.cpp : 定義控制臺應用程序的入口點。//#include "stdafx.h"#include <cstdlib>#include <ctime>#include<iostream>using std::cout;class Grand{private:  int hold;public :  Grand(int h = 0) :hold(h) {}  virtual void Speak() const { cout << "I am a grand class /n"; }  virtual int Value() const { return hold; }};class Superb :public Grand{public :  Superb(int h = 0) :Grand(h) {}  void Speak() const { cout << "I am a superb class ! /n"; }  virtual void Say() const   {    cout << "I hold the superb value of " << Value() << "! /n";  }};class Magnificent : public Superb{private :  char ch;public :  Magnificent(int h = 0, char c = 'A') :Superb(h), ch(c)  {  }  void Speak() const   {    cout << "I am a magnificent class !!!! /n";  }  void Say() const  {    cout << "I hold the character " << ch << " and the integer " << Value() <<"! /n";  }};Grand * GetOne();int main(){  std::srand(static_cast<unsigned int>(std::time(0)));  Grand * pg;  Superb * ps;  for (int i = 0; i < 5; i++)  {    pg = GetOne();    pg->Speak();    if (ps = dynamic_cast<Superb *>(pg)) {      ps->Say();    }  }  system("pause");  return 0;}Grand * GetOne(){  Grand * p = new Grand();  switch (std::rand() % 3)  {    delete p;  case 0:p = new Grand(std::rand() % 100); break;  case 1:p = new Superb(std::rand() % 100); break;  case 2:p = new Magnificent(std::rand() % 100, std::rand() % 26); break;  }  return p;}運行結果:I am a superb class !I hold the superb value of 3!I am a magnificent class !!!!I hold the character  and the integer 5!I am a grand classI am a grand classI am a magnificent class !!!!I hold the character  and the integer 87!請按任意鍵繼續. . .

2、typied運算符合type_info 類

typied 運算符能夠確定兩個對象是否為同類型。他接收兩種參數:1、類名、2、結果為對象的表達式

typied運算符返回的是一個type_info對象的引用,type_info在頭文件typeinfo(以前是typeinfo.h)的文件中定義。type_info類重載了== 和!=運算符,以便可以使用這些運算符來對類型進行比較。

示例: typeid(Manificnent) == typeid(*pg) 這個表達式結果為 bool值

如果pg是一個空指針,程序將引發bad_typied異常。該異常類型是從exception類中派生而來的。是在typeinfo中聲明的。

type_info類的實現隨廠商而異,但包含一個name()成員,該函數返回一個隨實現而異的字符串:通常是類的名字。

示例

// test1002.cpp : 定義控制臺應用程序的入口點。//#include "stdafx.h"#include <cstdlib>#include <ctime>#include<iostream>#include <typeinfo>using std::cout;class Grand{private:  int hold;public :  Grand(int h = 0) :hold(h) {}  virtual void Speak() const { cout << "I am a grand class /n"; }  virtual int Value() const { return hold; }};class Superb :public Grand{public :  Superb(int h = 0) :Grand(h) {}  void Speak() const { cout << "I am a superb class ! /n"; }  virtual void Say() const   {    cout << "I hold the superb value of " << Value() << "! /n";  }};class Magnificent : public Superb{private :  char ch;public :  Magnificent(int h = 0, char c = 'A') :Superb(h), ch(c)  {  }  void Speak() const   {    cout << "I am a magnificent class !!!! /n";  }  void Say() const  {    cout << "I hold the character " << ch << " and the integer " << Value() <<"! /n";  }};Grand * GetOne();int main(){  std::srand(static_cast<unsigned int>(std::time(0)));  Grand * pg;  Superb * ps;  for (int i = 0; i < 5; i++)  {    pg = GetOne();    cout << "Now Process type " << typeid (*pg).name() << ". /n"; //顯示    pg->Speak();    if (ps = dynamic_cast<Superb *>(pg)) {      ps->Say();    }  }  system("pause");  return 0;}Grand * GetOne(){  Grand * p = new Grand();  switch (std::rand() % 3)  {    delete p;  case 0:p = new Grand(std::rand() % 100); break;  case 1:p = new Superb(std::rand() % 100); break;  case 2:p = new Magnificent(std::rand() % 100, std::rand() % 26); break;  }  return p;}運行結果:Now Process type class Superb.I am a superb class !I hold the superb value of 86!Now Process type class Grand.I am a grand classNow Process type class Superb.I am a superb class !I hold the superb value of 48!Now Process type class Grand.I am a grand classNow Process type class Magnificent.I am a magnificent class !!!!I hold the character and the integer 75!請按任意鍵繼續. . .

上述代碼添加了一句 typied(*pg).name() 用于輸出類型信息,一般輸出為類名。

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩中文字幕| 精品欧美激情精品一区| 欧美在线观看网址综合| 久久久久一本一区二区青青蜜月| 亚洲女人天堂网| 伊人成人开心激情综合网| 91久久精品国产| 亚洲最大激情中文字幕| 午夜精品一区二区三区在线视频| 亚洲精品资源美女情侣酒店| 精品国产成人在线| 欧美一区二区三区精品电影| 久久精品免费电影| 91av国产在线| www.色综合| 国产精品一区二区女厕厕| 久久久久国产一区二区三区| 欧美日韩国产精品一区| 日本一区二区三区四区视频| 亚洲风情亚aⅴ在线发布| 日韩欧亚中文在线| 91精品国产高清久久久久久91| 91av视频在线观看| 国产亚洲精品日韩| 久久久999成人| 日韩最新中文字幕电影免费看| 欧美日韩成人网| 亚洲2020天天堂在线观看| 亚洲人成在线一二| 国产精品丝袜白浆摸在线| 成人黄色中文字幕| 亚洲欧美日韩中文在线| 国产精品国内视频| 91网在线免费观看| 国产精品网红直播| 欧美激情第一页xxx| 日韩欧美成人区| 一夜七次郎国产精品亚洲| 色综合久综合久久综合久鬼88| 国内精品久久久久伊人av| 亚洲国内精品在线| 高潮白浆女日韩av免费看| 国产脚交av在线一区二区| 亚洲国产天堂久久国产91| 精品综合久久久久久97| 国产欧美一区二区三区视频| 亚洲欧美制服第一页| 久久久精品一区| 成人午夜一级二级三级| 国产精品久久久久久久久久久久| 欧美激情免费视频| 亚洲va国产va天堂va久久| 91在线播放国产| 久久av中文字幕| 97av视频在线| 午夜精品美女自拍福到在线| 中文字幕免费国产精品| 国产99久久精品一区二区永久免费| 最近2019中文字幕在线高清| xvideos成人免费中文版| 91情侣偷在线精品国产| 国产69久久精品成人| 亚洲奶大毛多的老太婆| 亚洲欧洲在线看| 久久99热这里只有精品国产| 成人福利在线视频| 亚洲精品久久久一区二区三区| 国产精品久久久一区| 一区国产精品视频| 色与欲影视天天看综合网| 国产精品欧美风情| 欧美精品18videos性欧美| 国产精品美乳在线观看| 97免费中文视频在线观看| 九九久久久久99精品| 久久精品久久精品亚洲人| 日韩视频免费中文字幕| 日av在线播放中文不卡| 综合av色偷偷网| 成人综合国产精品| 亚洲自拍av在线| 亚洲欧美中文日韩在线v日本| 欧美在线一区二区三区四| 国产精品揄拍500视频| 欧美精品在线视频观看| 97欧美精品一区二区三区| 欧美成人精品h版在线观看| 欧美一性一乱一交一视频| 色综久久综合桃花网| 亚洲精品二三区| 亚洲自拍欧美色图| 中国日韩欧美久久久久久久久| 日本一区二区在线播放| 日韩国产在线播放| 日韩在线视频导航| 亚洲女人天堂视频| 国产精品96久久久久久| 国产91九色视频| 亚洲欧美日本精品| 九九热精品视频在线播放| 91高清在线免费观看| 欧美日韩成人网| 亚洲最大的av网站| 国产精品免费视频xxxx| 欧美日韩国产综合新一区| 亚洲精品国产综合区久久久久久久| 国产精品都在这里| 久久久久国产视频| 92国产精品久久久久首页| 亚洲福利视频免费观看| 亚洲综合日韩中文字幕v在线| 日韩欧美中文免费| 久久在精品线影院精品国产| 45www国产精品网站| 欧美亚洲国产日本| 亚洲精品乱码久久久久久金桔影视| 久久夜色精品国产亚洲aⅴ| 青草热久免费精品视频| 午夜精品久久久久久久久久久久| 浅井舞香一区二区| 亚洲女人天堂色在线7777| 欧美日韩国产一中文字不卡| 在线不卡国产精品| 国产98色在线| 亚洲国产精品久久久久秋霞不卡| 亚洲免费福利视频| 欧美极品美女视频网站在线观看免费| 亚洲人成电影网站色xx| 亚洲男人第一网站| 国产精品中文字幕在线观看| 成人午夜黄色影院| 中文一区二区视频| 亚洲午夜色婷婷在线| 一区二区三欧美| 亚洲男人天堂手机在线| 亚洲精美色品网站| 97超碰国产精品女人人人爽| 日本成人激情视频| 日韩精品久久久久久久玫瑰园| 在线播放国产一区中文字幕剧情欧美| 色婷婷综合久久久久中文字幕1| 亚洲第一中文字幕在线观看| 免费91在线视频| 国产亚洲精品久久久久久牛牛| 国产精品久久久久久久久| 欧美理论电影网| 成人福利在线视频| 成人国产精品一区二区| 在线免费观看羞羞视频一区二区| 国产99在线|中文| 欧美在线观看视频| 国产欧美一区二区白浆黑人| 国内精品中文字幕| 亚洲999一在线观看www| 亚洲国产精品电影| 亚洲精选中文字幕| 久久久久久久久久久久av| 夜夜嗨av一区二区三区免费区| 大桥未久av一区二区三区| 国产亚洲综合久久| 欧美俄罗斯性视频| 国产69精品久久久久久| 亚洲欧美精品一区| 亚洲变态欧美另类捆绑|