对于C ++,是否可以打印派生类的对象的超类成员

时间:2018-12-14 16:13:40

标签: c++ gdb member

我从谷歌搜索中发现,可以像通过here

所述那样,通过简单地将其映射到超类对象的指针来打印指向子类对象的指针的成员。
(gdb) p *(SubClass*)baseClassInstance

我可以相反吗?例如,在此代码段中,类GponItf派生自InterfaceType。当我尝试打印GponItf类的实例type_m的成员时,得到以下信息:

(gdb) p *type_m
$161 = (ItfMgnt::GponItf) {
  <ItfMgnt::InterfaceType> = {
     _vptr.InterfaceType = 0xb4f0ea8 <vtable for ItfMgnt::GponItf+8>   > 
  },
  members of ItfMgnt::GponItf:
  static uniqueInstance = 0xee270afc
}

是否可以在基类InterfaceType中显示成员?我也看过打印vtbl,但是它显示的是方法,而不是成员:

(gdb) show print vtbl on
(gdb) print /a (*(void ***)type_m)[0]@10

保罗

2 个答案:

答案 0 :(得分:0)

只要求在基类中打印铸件

我的意思是p (InterfaceType *) type_m

答案 1 :(得分:0)

C / C ++类的所谓的 properties 通常是固定的,不像其他语言那样动态-它们由连续的内存块组成,其结构在 compile < / em>时间取决于语言。 (而在Perl中,“对象”是一个哈希。)

该类的方法是使用vtbl实现的,它指向每次调用都应调用的可执行代码。但是,除了可能出于运行时调试器的好处之外,没有这样的编译时数据结构来描述属性。

子类将扩大属性区域,以容纳仅存在于子类中的属性的存储,它们也可能具有自己的方法表条目。