【发布时间】:2020-02-05 10:50:10
【问题描述】:
我目前正在学习 Run-Time Type ID 和 Casting Operator。我有一些问题,你能帮我解决这个疑惑吗?
见以下代码:
#include <iostream>
#include <typeinfo>
using namespace std;
class base
{
};
class derived
{
};
int main()
{
cout<<typeid(char).name()<<endl;
cout<<typeid(int).name()<<endl;
cout<<typeid(float).name()<<endl;
cout<<typeid(double).name()<<endl;
cout<<typeid(base).name()<<endl;
cout<<typeid(derived).name()<<endl;
}
输出:
c
i
f
d
4base
7derived
Process returned 0 (0x0) execution time : 0.238 s
Press any key to continue.
问题:
typeid(base).name()给出“4base”;这里4是什么,typeid(derived).name()给出“7derived”;7这里是什么?为什么
typeid(char).name()和其他内置数据类型只给出第一个字母?type_info::before()函数是什么?
感谢您的宝贵时间和回答。
【问题讨论】:
-
名称由实现定义。如果他们愿意,他们可以归还小狗。如果您想要一个可读的名称,对于 gcc,请参阅 gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html 。
-
乍一看,4 和 7 分别是 'base' 和 'derived' 的长度。如果您查看 Andrei 的链接,看起来这个长度前缀是 GCC 的修饰方案中字符串名称的分隔方式。
-
@AndreiDamian 虽然这是真的,但这并不能真正解释 为什么,这是一个非常有效的问题。
-
@KonradRudolph 答案是“因为他们可以”。
标签: c++