在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论