ГБД 7.11
Начиная с GDB 7.11, GCC 5.3.1, Ubuntu 16.04, просто:
p *myBase
для чего-то скомпилированного с:
gcc -O0 -ggdb3
может быть достаточно, поскольку это уже показывает:
$1 = {_vptr.MyBase = 0x400c00 <vtable for MyDerived1+16>}
где MyDerived1
- текущий производный класс, который мы ищем.
Но если вы делаете дополнительно:
set print object on
вывод еще яснее и выглядит так:
$1 = (MyDerived1) {<MyBase> = {_vptr.MyBase = 0x400c00 <vtable for MyDerived1+16>}, <No data fields>}
Это также влияет на другие команды, такие как:
ptype myBase
, который показывает:
type = /* real type = MyDerived1 * */
class MyBase {
public:
virtual int myMethod(void);
} *
вместо:
type = class MyBase {
public:
virtual int myMethod(void);
} *
В этом случае не было указания на производный тип без set print object on
.
whatis
затрагивается аналогично:
(gdb) whatis myBase
type = MyBase *
(gdb) set print object on
(gdb) whatis myBase
type = /* real type = MyDerived1 * */
MyBase *
Тестовая программа:
#include <iostream>
class MyBase {
public:
virtual int myMethod() = 0;
};
class MyDerived1 : public MyBase {
public:
virtual int myMethod() { return 1; }
};
class MyDerived2 : public MyBase {
public:
virtual int myMethod() { return 2; }
};
int main() {
MyBase *myBase;
MyDerived1 myDerived1;
MyDerived2 myDerived2;
myBase = &myDerived1;
std::cout << myBase->myMethod() << std::endl;
myBase = &myDerived2;
std::cout << myBase->myMethod() << std::endl;
}