当多态类的typeid得到指向派生类的指针时,它表示它是基类的指针!为什么?

问题描述

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的指针),但现在您要的是指向的东西,对于派生对象多态类的类是派生类。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...