问题描述
g ++ 6.3.1。
此gdb
会话说明dynamic_cast<>
做正确的事,编译器显示了派生的vtbl
。错误的派生类的dynamic_cast<>
正确返回0
,而正确的类返回正确的指针。是的,typeid().name()
显示了基类(或其改写),P2TEBase
!为什么会这样?
(gdb) whatis pteExpect
type = TEBase *
(gdb) p *pteExpect
$1 = {
_vptr.TE = 0x43cef8 <vtable for TEDerived1+16>
}
(gdb) p dynamic_cast<TEDerived2*>(pteExpect)
$2 = (TEDerived2*) 0x0
(gdb) p dynamic_cast<TEDerived1*>(pteExpect)
$3 = (TEDerived1*) 0x43cef8 <vtable for TEDerived1+16>
(gdb) l 170
170 Error( "required %s not found",typeid( pteExpect ).name() );
(gdb) n
Reading in symbols for akstatus.c...done.
E 10.09 18:18:07.438818 main.cpp:170 Expect() - required P2TEBase not found
解决方法
在指向
typeid
的指针上调用了 TEBase
,因此该变量 truly的类型是指向基本类型的指针,即使碰巧指向其他内容。
为了记录派生类的类名,只需使用typeid( *pteExpect ).name()
,您将看到g ++ 6.3.1将产生的9TEDerived
整齐的名称。现在,您没有在问指针(即使对象不是基类也总是指向TE
的指针),但现在您要的是指向的东西,对于派生对象多态类的类是派生类。