You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传入派生类指针时多态类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:02:44