• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++typeid

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

typeid是C++的关键字之一,等同于sizeof这类的操作符。typeid操作符的返回结果是名为type_info的标准库类型的对象的引用。type_info中存储特定类型的有关信息,定义在typeinfo头文件中。

 

下面来看typeid().name(),用于获得表达式的类型,以c-style字符串形式返回类型名。用法示例如下

#include<iostream>  
#include <typeinfo>  
using namespace std;  

class Class1{};
class Class2:public Class1{};
void fn0();
int fn1(int n);

int main(void)  
{  
    int a = 10;
    int* b = &a;
    float c;
    double d;

    cout << typeid(a).name() << endl;
    cout << typeid(b).name() << endl;
    cout << typeid(c).name() << endl;
    cout << typeid(d).name() << endl;
    cout << typeid(Class1).name() << endl;
    cout << typeid(Class2).name() << endl;
    cout << typeid(fn0).name() << endl;
    cout << typeid(fn1).name() << endl;
    cout << typeid(typeid(a).name()).name() << endl;
    system("pause");
}  

结果如下:

int
int *
float
double
class Class1
class Class2
void __cdecl(void)
int __cdecl(int)
char const *
请按任意键继续. . .

 

如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时计算;否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。

#define OUTPUT(f)	cout << #f << "\t: " << typeid(f).name() << endl;
class BaseA {};
class DeriveA: public BaseA {};
 
class BaseB 
{
	virtual void f(){} 
};
class DeriveB: public BaseB {};
 
int _tmain(int argc, _TCHAR* argv[])
{
	cout << "-------直接处理类名-------" <<endl;
 
	OUTPUT(BaseA);
	OUTPUT(DeriveA);
	OUTPUT(BaseB);
	OUTPUT(DeriveB);
 
	cout << endl << "-------基类不含虚函数-------" <<endl;
 
	BaseA baseA;
	DeriveA deriveA;
	OUTPUT(baseA);
	OUTPUT(deriveA);
	
	BaseA* pa;
	pa = &baseA;
	OUTPUT(*pa);
	OUTPUT(pa);
	pa = &deriveA;
	OUTPUT(*pa);
	OUTPUT(pa);
 
	cout << endl << "-------基类含有虚函数-------" <<endl;
 
	BaseB baseB;
	DeriveB deriveB;
	OUTPUT(baseB);
	OUTPUT(deriveB);
 
	BaseB* pb;
	pb = &baseB;
	OUTPUT(*pb);
	OUTPUT(pb);
	pb = &deriveB;
	OUTPUT(*pb);
	OUTPUT(pb);
}

结果如下:

1.当typeid操作符的操作数是不带有虚函数的类类型时,typeid操作符会指出操作数的类型,而不是底层对象的类型。

2.如果typeid操作符的操作数是至少包含一个虚拟函数的类类型时,并且该表达式是一个基类的引用,则typeid操作符指出底层对象的派生类类型。

 

 

参考:

https://blog.csdn.net/lin453701006/article/details/73972184

https://blog.csdn.net/zkybeck_ck/article/details/51762541

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C语言基础发布时间:2022-07-14
下一篇:
c#调用存储过程发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap