これはHow to determine if an object is an instance of certain derived C++ class from a pointer to a base class in GDB?と同じ質問ですが、これはPythonのgdb拡張からも同じです。その質問への答えに示されているのと同じ例を考えるとGDBのベースクラスポインタからPython経由で派生クラス情報を取得する方法
:応答で述べたように
#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) b 24
Breakpoint 1 at 0x400a19: file derived.cc, line 24.
(gdb) run
Starting program: /home/ubuntu/c-test/derived/derived
1
Breakpoint 1, main() at derived.cc:24
24 myBase = &myDerived2;
(gdb) p *myBase
$1 = {_vptr.MyBase = 0x400c00 <vtable for MyDerived1+16>}
(gdb) set print object on
(gdb) p *myBase
$2 = (MyDerived1) {<MyBase> = {_vptr.MyBase = 0x400c00 <vtable for MyDerived1+16>}, <No data fields>}
だから私は、これはのインスタンスであることがわかりますMyDerived1。しかし、Pythonでは、私は以下を取得します。
(gdb) python-interactive
>>> myBase = gdb.parse_and_eval("myBase")
>>> str(myBase.type)
'MyBase *'
Python拡張モジュールで実際のクラスを取得するにはどうすればよいですか?実際の目的は、インスタンスを正しい派生クラスにキャストできるようにすることです。その派生クラスに固有の情報をきれいに印刷できます。