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