在C ++中,您可以将指针声明为一种类型,然后将其指向另一种继承类型。有没有办法告诉你当前指的是什么?
#include <typeinfo>
using namespace std;
class Foo
{
};
class Bar : public Foo
{
};
int main()
{
Bar bar;
Foo* foo = &bar;
bool I_WANT_THIS_TO_BE_TRUE = (typeid(*foo) == typeid(Bar));
return 0;
}
答案 0 :(得分:7)
此操作失败,因为您未在Foo
中声明任何虚拟功能。例如,改变它有一个虚拟析构函数,你将获得所希望的结果。
答案 1 :(得分:2)
您正在寻找的是反射或RTTI(运行时类型信息)。
有关开始使用主题的信息,请参阅此处:Attribute & Reflection libraries for C++?
不出所料,维基百科也有关于RTTI的文章:http://en.wikipedia.org/wiki/Run-time_type_information
然后有一些框架为从一些公共基类派生的对象提供反射特征(它提供了反射方法,继承到所有子类)。一个例子是Qt's meta object system。这些可以提供比普通C ++ RTTI更多的信息,并提供全反射支持(例如在编译时调用名称未知的方法,例如调用C ++方法的javascript代码)。