有没有办法告诉指针在C ++中实际指向的类型

时间:2012-12-30 13:32:31

标签: c++ pointers inheritance polymorphism generic-programming

在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;
}

2 个答案:

答案 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代码)。