贡献者: addis
typeid
关键字必须使用 <typeinfo>
头文件
const std::type_info &tid = typeid(变量名或类型)
sizeof(std::type_info)
用 g++ 测试是 16 字节。
tid.name()
会返回一个表示该类型的字符串,取决于编译器,且不一定是 human readable 的(例如 g++)。
tid.hash_code()
返回类型的 hash,类型是 size_t
typedef
和 using
都不会改变 typeid,也就是 typeid(A) == typeid(B)
。
gdb
用 p 变量
显示类型和值,ptype 变量
或 pt 变量
显示类型。检查长度用 p sizeof(变量)
。typeid
一般只用于检查两个类型是否相同或者一个变量是否是某个类型。
tid1 == tid2
可以判断是否是同一类型。这里加上 const
或者 &
(或者两者)视为同一类型。但加上 *
(指针)不是同一类型。
B
继承 A
,定义 B b; A *pa = &b;
,那么 typeid(*pa) == typeid(b)
结果是什么呢?这取决于 A,B
的具体定义。
g++ -std=11
测试,如果 A
中没有 virtual
函数(即不存在多态),那么返回 false
。
A
不是抽象类但有 virtual
(存在多态)则返回 true
。
A
是一个抽象类(即存在 pure virtual function)则会产生编译错误,因为 typeid
无法对抽象类使用。
A
不是抽象类但有 virtual
(存在多态)则返回 true
。
typeof()
一般来说和是静态编译的,但如果使用了多态,那么将变为一个动态操作。