真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++中RTTI怎么用-創(chuàng)新互聯(lián)

這篇文章主要介紹了C++ 中RTTI怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計與策劃設(shè)計,農(nóng)安網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:農(nóng)安等地區(qū)。農(nóng)安做網(wǎng)站價格咨詢:13518219792

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

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

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

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

typied運(yùn)算符返回一個指出對象的類型的值

type_info結(jié)構(gòu)存儲了有關(guān)特定類型的信息

假設(shè)我們有下面的類層次結(jié)構(gòu):

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

假設(shè)有下面的指針:

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 如果可以安全的轉(zhuǎn)換為Superb * 則返回對象地址,否則返回一個空指針。

示例:

// test1002.cpp : 定義控制臺應(yīng)用程序的入口點。
//

#include "stdafx.h"
#include 
#include 
#include

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(std::time(0)));
  Grand * pg;
  Superb * ps;
  for (int i = 0; i < 5; i++)
  {
    pg = GetOne();
    pg->Speak();
    if (ps = dynamic_cast(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;
}
運(yùn)行結(jié)果:
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 class
I am a grand class
I am a magnificent class !!!!
I hold the character  and the integer 87!
請按任意鍵繼續(xù). . .

2、typied運(yùn)算符合type_info 類

typied 運(yùn)算符能夠確定兩個對象是否為同類型。他接收兩種參數(shù):1、類名、2、結(jié)果為對象的表達(dá)式

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

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

如果pg是一個空指針,程序?qū)⒁l(fā)bad_typied異常。該異常類型是從exception類中派生而來的。是在typeinfo中聲明的。

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

示例

// test1002.cpp : 定義控制臺應(yīng)用程序的入口點。
//

#include "stdafx.h"
#include 
#include 
#include
#include 
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(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(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;
}
運(yùn)行結(jié)果:
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 class
Now 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 class
Now Process type class Magnificent.
I am a magnificent class !!!!
I hold the character and the integer 75!
請按任意鍵繼續(xù). . .

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C++ 中RTTI怎么用”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)建站,關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


分享標(biāo)題:C++中RTTI怎么用-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://weahome.cn/article/jpcoc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部