我有一些代码,typeid不会打印运行时对象类型。代码示例是:
class interface
{
public:
virtual void hello()
{
cout << "Hello interface: " << typeid(interface).name() << endl;
}
virtual ~interface() {}
};
class t1 : public interface
{
public:
virtual void hello ()
{
cout << "Hello t1: " << typeid(t1).name() << endl;
}
};
class t2 : public t1
{
public:
void hello ()
{
cout << "Hello t2: " << typeid(t2).name() << endl;
}
};
......
interface *p;
t1 *p1;
t2 *p2, *pt2;
t3 *p3, *pt3;
pt2 = new t2;
std::cout << "type1: " << abi::__cxa_demangle(typeid(pt2).name(), 0, 0, &status) << "\n\n";
p = pt2;
assert(p != NULL);
p->hello();
std::cout << "type2: " << abi::__cxa_demangle(typeid(p).name(), 0, 0, &status) << "\n\n";
p1 = dynamic_cast<t1 *>(p);
assert(p1 != NULL);
p1->hello();
std::cout << "type3: " << abi::__cxa_demangle(typeid(p1).name(), 0, 0, &status) << "\n\n";
p2 = dynamic_cast<t2 *>(p);
assert(p2 != NULL);
p2->hello();
std::cout << "type4: " << abi::__cxa_demangle(typeid(p2).name(), 0, 0, &status) << "\n\n";
我使用“g ++ -g -o ...”构建程序。然后输出是:
type1:t2 *
你好t2:2t2
type2:interface *你好t2:2t2
type3:t1 *你好t2:2t2
type4:t2 *
打印输出似乎正确。但我希望type2对于RTTI来说也是 t2 * 。但是,输出为 interface * 。我希望type3也是 t2 * 。怎么了?
答案 0 :(得分:2)
std :: typeid仅在向其传递具有动态类型的对象时才为您提供动态类型信息,但指针不被视为具有动态类型,因为它们不包含任何虚拟方法。
所以如果你做了std :: typeid(* p)你会得到你正在寻找的东西