c++ typeid 注意事项
typeid
对于不含有虚函数的类对象,无法识别
对于含有虚函数的对象能够识别
无法准确识别任何指针对象
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class BaseNoVirtual
{
};
class DeriveNoVirtual
:public BaseNoVirtual
{
};
class BaseVirtual
{
public:
virtual int VirtualFn()
{
return 0;
}
};
class DeriveVirtual
:public BaseVirtual
{
public:
int VirtualFn()
{
return 1;
}
};
string WhoAreYou_PointNoVirtual(BaseNoVirtual* a_p)
{
return typeid(a_p).name();
}
string WhoAreYou_NoVirtual(BaseNoVirtual* a_p)
{
return typeid(*a_p).name();
}
string WhoAreYou_PointVirtual(BaseVirtual* a_p)
{
return typeid(a_p).name();
}
string WhoAreYou_Virtual(BaseVirtual* a_p)
{
return typeid(*a_p).name();
}
int main()
{
auto bnv = BaseNoVirtual();
auto dnv = DeriveNoVirtual();
cout << "BaseNoVirtual 对象: " << typeid(bnv).name() << endl;
cout << "DeriveNoVirtual 对象: " << typeid(dnv).name() << endl;
auto pbnv = new BaseNoVirtual();
auto pdnv = new DeriveNoVirtual();
cout << "BaseNoVirtual 指针: " << typeid(pbnv).name() << endl;
cout << "DeriveNoVirtual 指针: " << typeid(pdnv).name() << endl;
cout << "BaseNoVirtual PVOID指针: " << typeid((void*)pbnv).name() << endl;
cout << "DeriveNoVirtual PVOID指针: " << typeid((void*)pdnv).name() << endl;
cout << "BaseNoVirtual 函数无虚基类指针: " << WhoAreYou_PointNoVirtual(pbnv) << endl;
cout << "DeriveNoVirtual 函数无虚基类指针: " << WhoAreYou_PointNoVirtual(pdnv) << endl;
cout << "BaseNoVirtual 函数无虚基类对象: "<< WhoAreYou_NoVirtual(pbnv) << endl;
cout << "DeriveNoVirtual 函数无虚基类对象: " << WhoAreYou_NoVirtual(pdnv) << endl;
cout << endl << endl << endl;
auto bv = BaseVirtual();
auto dv = DeriveVirtual();
cout << "BaseVirtual 对象: " << typeid(bv).name() << endl;
cout << "DeriveVirtual 对象: " << typeid(dv).name() << endl;
auto pbv = new BaseVirtual();
auto pdv = new DeriveVirtual();
cout << "BaseVirtual 指针: " << typeid(pbv).name() << endl;
cout << "DeriveVirtual 指针: " << typeid(pdv).name() << endl;
cout << "BaseVirtual PVOID指针: " << typeid((void*)pbv).name() << endl;
cout << "DeriveVirtual PVOID指针: " << typeid((void*)pdv).name() << endl;
cout << "BaseVirtual 函数有虚基类指针: " << WhoAreYou_PointVirtual(pbv) << endl;
cout << "DeriveVirtual 函数有虚基类指针: " << WhoAreYou_PointVirtual(pdv) << endl;
cout << "BaseVirtual 函数有虚基类对象: " << WhoAreYou_Virtual(pbv) << endl;
cout << "DeriveVirtual 函数有虚基类对象: " << WhoAreYou_Virtual(pdv) << endl;
return 0;
}
BaseNoVirtual 对象: class BaseNoVirtual
DeriveNoVirtual 对象: class DeriveNoVirtual
BaseNoVirtual 指针: class BaseNoVirtual * __ptr64
DeriveNoVirtual 指针: class DeriveNoVirtual * __ptr64
BaseNoVirtual PVOID指针: void * __ptr64
DeriveNoVirtual PVOID指针: void * __ptr64
BaseNoVirtual 函数无虚基类指针: class BaseNoVirtual * __ptr64
DeriveNoVirtual 函数无虚基类指针: class BaseNoVirtual * __ptr64
BaseNoVirtual 函数无虚基类对象: class BaseNoVirtual
DeriveNoVirtual 函数无虚基类对象: class BaseNoVirtual
BaseVirtual 对象: class BaseVirtual
DeriveVirtual 对象: class DeriveVirtual
BaseVirtual 指针: class BaseVirtual * __ptr64
DeriveVirtual 指针: class DeriveVirtual * __ptr64
BaseVirtual PVOID指针: void * __ptr64
DeriveVirtual PVOID指针: void * __ptr64
BaseVirtual 函数有虚基类指针: class BaseVirtual * __ptr64
DeriveVirtual 函数有虚基类指针: class BaseVirtual * __ptr64
BaseVirtual 函数有虚基类对象: class BaseVirtual
DeriveVirtual 函数有虚基类对象: class DeriveVirtual
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能