热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

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

这篇文章主要介绍了C++中RTTI的使用方法详解的相关资料,希望通过本文大家能理解使用RTTI,需要的朋友可以参考下

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 (pg) ; 

这样 指针 pg 如果可以安全的转换为Superb * 则返回对象地址,否则返回一个空指针。

示例:

// test1002.cpp : 定义控制台应用程序的入口点。
//

#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 " <(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;
}
运行结果:
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!
请按任意键继续. . .

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 
#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 " <(std::time(0)));
  Grand * pg;
  Superb * ps;
  for (int i = 0; i <5; i++)
  {
    pg = GetOne();
    cout <<"Now Process type " <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;
}
运行结果:
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!
请按任意键继续. . .

上述代码添加了一句 typied(*pg).name() 用于输出类型信息,一般输出为类名。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • Ping 命令的高级用法与技巧
    本文详细介绍了 Ping 命令的各种高级用法和技巧,帮助读者更好地理解和利用这一强大的网络诊断工具。 ... [详细]
  • Halcon之图像梯度、图像边缘、USM锐化
    图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像卷积:1.模糊2.梯度3.边缘4.锐化1.视频教程:B站、 ... [详细]
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • 本文详细介绍了在 React Native 开发过程中遇到的 'Could not connect to development server' 错误及其解决方法。该问题不仅影响开发效率,而且难以通过网络资源找到确切的解决方案。本文将提供详细的步骤,帮助开发者快速解决这一常见问题。 ... [详细]
  • 微信小程序详解:概念、功能与优势
    微信公众平台近期向200位开发者发送了小程序的内测邀请。许多人对微信小程序的概念还不是很清楚。本文将详细介绍微信小程序的定义、功能及其独特优势。 ... [详细]
  • 本文提供了一个C++程序,用于读取一系列整数并统计其中正整数和负整数的个数。当输入为0时,程序结束。 ... [详细]
  • 对于众多创业公司而言,选择小程序或小视频的发展方向至关重要。本文将深入分析小程序和小视频的特点、优势及局限,帮助创业者做出更明智的选择。 ... [详细]
  • Dell Latitude 5290 2-in-1 平板电脑黑苹果体验评测
    本文基于notebookcheck的详细数据和个人实际使用体验,对Dell Latitude 5290 2-in-1平板电脑进行评测。评测内容包括外观设计、散热性能、基准测试、游戏表现和续航能力等方面,旨在为读者提供全面的参考。 ... [详细]
  • 本文详细介绍了Shell脚本中单引号、双引号和反引号的使用方法及其特点,帮助开发者更好地理解和应用这些引号。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文介绍如何使用命令行工具查看和解析 iOS 应用崩溃日志,包括 UUID 和错误代码位置的详细步骤。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 本文介绍了如何使用 CMD 批处理脚本进行文件操作,包括将指定目录下的 PHP 文件重命名为 HTML 文件,并将这些文件复制到另一个目录。 ... [详细]
  • 本文详细介绍了DMA控制器如何通过映射表处理来自外设的请求,包括映射表的设计和实现方法。 ... [详细]
author-avatar
没搜摸索摸索_685
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有