GDB 7,11
по БГД 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;
}
Я не GDB профессионалом, но вы можете быть в состоянии пройти через указатель v-таблицы (который является то, что ваша база указатель класса буквально указывает на) и разрешает имя функций. – selbie
@selbie, консультирующийся с v-столом, именно то, что ptype делает под капотом, если объект {set print object on} активен, как указывал Бета в своем ответе –