本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。