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

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

本文主要介绍c中RTTI用法详解的相关资料,希望大家通过本文了解RTTI的用法,有需要的朋友可以参考一下。

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

RTTI是运行时类型标识的缩写。这是C新增的特性之一,很多老式的实现都不支持。其他实现可以包括用于开关RTTI的编译器设置。RTTI旨在为程序在运行时确定对象类型提供一种标准方法。很多类库都成为了它们的父类对象,提供了实现这种方式的功能。但由于C内部不支持,各厂商的机制通常互不兼容。创建RTTI语言标准将使未来的图书馆相互兼容。

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

如果可能,dynamic_cast操作符将使用指向基类的指针来生成指向派生类的指针;否则,操作符返回0——空指针。

类型化运算符返回一个指示对象类型的值。

type_info结构存储关于特定类型的信息。

假设我们有下面的类层次结构:

类Grand {//有虚方法};

超级舱:公共舱.}

阶级壮丽:公共高超{.}

假设您有以下指针:

Grand *pg=新Grand;

Grand * ps=new Superd

Grand * pm=new Manificent

1、dynamic_cast

我们来看看dynamic_cast的语法,用法如下,其中pg指向一个对象。

高超pm=dynamic_cast高超(pg);

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

示例:

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

//

#include 'stdafx.h '

#包含cstdlib

#包括ctime

#includeiostream

使用STD:cout;

班级大赛

{

私人:

int hold

公共:

Grand(int h=0) :hold(h) {}

virtual void Speak() const { cout '我是大类\ n ';}

虚拟int Value()const { return hold;}

};

一流:公共大

{

公共:

Superb(int h=0) :Grand(h) {}

void Speak() const { cout '我是超一流的!\ n ';}

虚拟void Say() const

{

cout '我持有' value()'的超高值!\ n ';

}

};

课堂精彩:公共精彩

{

私人:

char ch

公共:

宏伟的(int h=0,char c='A '):极好的(h),ch(c)

{

}

void Speak() const

{

cout '我是一个宏伟的类!\ n ';

}

void Say()常量

{

cout '我持有字符' ch '和整数' Value()'!\ n ';

}

};

grand * GetOne();

int main()

{

STD:srand(static _ cast unsigned int(STD:time(0)));

Grand * pg

高超的* ps

for(int I=0;i5;我)

{

pg=GetOne();

pg-Speak();

if(PS=dynamic _ cast superb *(pg)){

PS-Say();

}

}

系统(“暂停”);

返回0;

}

Grand * GetOne()

{

Grand * p=new Grand();

开关(std:rand() % 3)

{

删除p;

案例0:p=new Grand(STD:rand()% 100);打破;

案例一:p=新高超(STD:rand()% 100);打破;

案例二:p=新华丽(std:rand() % 100,STD:rand()% 26);打破;

}

返回p;

}

运行结果:

我是超一流的!

我持有3的超高值!

我是一个华丽的班级!

我持有字符和整数5!

我是一个大班级

我是一个大班级

我是一个华丽的班级!

我持有字符和整数87!

请按任意键继续。

2、typied运算符合type_info 类

类型化运算符可以确定两个对象是否属于同一类型。他接收两个参数:1,类名,2,结果是对象的表达式。

typed运算符返回对type_info对象的引用,type_info在头文件typeinfo(以前的typeinfo.h)的文件中定义。Type_info class overloads==and!=运算符,以便您可以使用这些运算符来比较类型。

示例:typeid (manificent)==typeid (* pg)此表达式产生一个布尔值。

如果pg是空指针,程序将抛出一个bad _ typied异常。异常类型是从异常类派生的。是在typeinfo中声明的。

类型信息类的实现随厂商而异,但包含一个名称()成员,该函数返回一个随实现而异的字符串:通常是类的名字。

示例

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

//

#include 'stdafx.h '

#包含cstdlib

#包括ctime

#includeiostream

#包含类型信息

使用STD:cout;

班级大赛

{

私人:

中间保持

公共:

Grand(int h=0) :hold(h) {}

虚拟void Speak() const { cout '我是大类\ n ';}

虚拟int Value()const { return hold;}

};

一流:公共大

{

公共:

Superb(int h=0) :Grand(h) {}

void Speak() const { cout '我是超一流的!\ n ';}

虚拟void Say()常量

{

cout '我持有值()'的超高值!\ n ';

}

};

课堂精彩:公共精彩

{

私人:

char ch

公共:

宏伟的(int h=0,char c='A '):极好的(h),ch(c)

{

}

void Speak() const

{

cout '我是一个宏伟的类!\ n ';

}

void Say()常量

{

cout '我持有字符' ch '和整数Value()'!\ n ';

}

};

grand * GetOne();

int main()

{

STD:srand(static _ cast无符号int(STD:time(0)));

Grand * pg

高超的* ps

for(int I=0;i5;我)

{

pg=GetOne();

cout "现在处理类型typeid (*pg).名称()'。\ n ';//显示

pg-Speak();

if(PS=dynamic _ cast superb *(pg)){

PS-Say();

}

}

系统("暂停");

返回0;

}

Grand * GetOne()

{

Grand * p=new Grand();

开关(std:rand() % 3)

{

删除p;

案例0:p=new Grand(STD:rand()% 100);打破;

案例一:p=新高超(STD:rand()% 100);打破;

案例二:p=新华丽(std:rand() % 100,STD:rand()% 26);打破;

}

返回p;

}

运行结果:

现在工艺类一流。

我是超一流的!

我拿着86的超值!

现在处理类型类盛大.

我是一个大班级

现在工艺类一流。

我是超一流的!

我拿着48的超值!

现在处理类型类盛大.

我是一个大班级

现在过程类型类华丽。

我是一个华丽的班级!

我持有字符和整数75!

请按任意键继续。

上述代码添加了一句打字(*第9页).名称()用于输出类型信息,一般输出为类名。

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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • vs2015打包安装程序,vs2015程序打包,VS2022实现VC++打包生成安装文件图文详细历程
  • vc++6.0的快捷键,vc 快捷键
  • vc++6.0的快捷键,vc 快捷键,VC6.0常用快捷键大全
  • 绘制圆角矩形的方法,c++ 画矩形,C#画圆角矩形的方法
  • 懒汉式和饿汉式代码,单列模式懒汉和饿汉,C++单例模式的懒汉模式和饿汉模式详解
  • 好用的C++编译器,c++编译软件哪个好
  • semaphore c#,c++ semaphore
  • semaphore c#,c++ semaphore,C++中Semaphore内核对象用法实例
  • dev-c++使用教程,dev c++安装教程
  • dev-c++使用教程,dev c++安装教程,Dev C++ 安装及使用方法(图文教程)
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针,简单总结C++中指针常量与常量指针的区别
  • com组件初始化失败,c#开发com组件,C++中COM组件初始化方法实例分析
  • c++静态成员变量使用,c++静态成员函数和静态成员变量
  • c++静态成员变量使用,c++静态成员函数和静态成员变量,详解c++ 静态成员变量
  • 留言与评论(共有 条评论)
       
    验证码: