传入派生类指针时多态类typeid显示基类?g++6.3.1下的疑问
问题原因分析与解决方案
这是一个典型的对typeid操作符的误解——你现在调用的是typeid(pteExpect),这里的操作数是指针变量本身,而不是它指向的对象!
关键知识点
- 当
typeid作用于指针类型(而非解引用后的对象)时,它返回的是该指针的静态类型(也就是你声明变量时的TEBase*),完全不会考虑指针实际指向的动态类型。这就是为什么你看到的名字是修饰后的P2TEBase——P代表指针,2TEBase是TEBase的名字修饰形式。 - 而
dynamic_cast之所以能正常工作,是因为它会检查指针指向的对象的实际动态类型,这是它的核心设计目标。
修复方法
如果你想获取指针指向对象的动态类型,需要对指针进行解引用,调用typeid(*pteExpect).name():
Error( "Required %s not found", typeid( *pteExpect ).name() );
⚠️ 注意:使用typeid(*指针)时,必须确保指针不为空,否则会抛出std::bad_typeid异常。从你的gdb输出看,pteExpect是有效的非空指针,所以这里没问题。
结合你的gdb会话验证
从p *pteExpect的输出可以看到,对象的虚表指针指向vtable for TEDerived1,说明实际类型确实是TEDerived1。只要你改成typeid(*pteExpect),就能得到TEDerived1对应的名字修饰结果了。
内容的提问来源于stack exchange,提问作者Swiss Frank
相关产品推荐
相关产品推荐

