Given a real Python class 'A', a wrapped C++ class 'B', and this definition: class C(A, B): def __init__(self): B.__init__(self) self.x = 1 ... c = C() this diagram describes the internal structure of an instance of 'C', including its inheritance relationships. Note that ExtensionClass is derived from Class, and is in fact identical for all intents and purposes. MetaClass +---------+ +---------+ types.ClassType: | | | | | | | | | | | | +---------+ +---------+ ^ ^ ^ PyClassObject | ExtensionClass | | A: +------------+ | B: +------------+ | | | ob_type -+-+ | ob_type -+-----+ | | | ()<--+- __bases__ | | | | | __dict__ -+->{...} | | | 'B'<-+- __name__ | | +------------+ +------------+ | ^ ^ | | | | +-----+ +-------------+ | | | | | | Class | | | C: +------------+ | | | | ob_type -+------------+ tuple:(*, *)<--+- __bases__ | | __dict__ -+->{__module__, } 'C' <-+- __name__ | +------------+ ^ (in case of inheritance from more than one | extension class, this vector would contain +---------------+ a pointer to an instance holder for the data | of each corresponding C++ class) | ExtensionInstance | c: +---------------------+ std::vector +----+- __class__ | +---+-- | m_wrapped_objects -+->| * | ... {'x': 1}<-+- __dict__ | +-|-+-- +---------------------+ | InstanceValueHolder | +--------------------------------+ +-->| (contains a C++ instance of B) | +--------------------------------+ In our inheritance test cases in extclass_demo.cpp/test_extclass.py, we have the following C++ inheritance hierarchy: +-----+ +----+ | A1 | | A2 | +-----+ +----+ ^ ^ ^ ^ ^ | | | | | +-----+ | +---------+-----+ | | | | | +---+----------+ .......!...... | | : A_callback : +-+--+ +-+--+ :............: | B1 | | B2 | +----+ +----+ ^ | +-------+---------+ | | +-+-+ ......!....... | C | : B_callback : +---+ :............: A_callback and B_callback are used as part of the wrapping mechanism but not represented in Python. C is also not represented in Python but is delivered there polymorphically through a smart pointer. This is the data structure in Python. ExtensionClass A1: +------------+ ()<--+- __bases__ | | __dict__ -+->{...} +------------+ ^ | ExtensionInstance | a1: +---------------------+ vec InstanceValueHolder +---------+- __class__ | +---+ +---------------------+ | | m_wrapped_objects -+->| *-+-->| contains A_callback | | +---------------------+ +---+ +---------------------+ | | ExtensionInstance | pa1_a1: +---------------------+ vec InstancePtrHolder,A1> +---------+- __class__ | +---+ +---+ | | m_wrapped_objects -+->| *-+-->| *-+-+ A1 | +---------------------+ +---+ +---+ | +---+ | +->| | | ExtensionInstance +---+ | pb1_a1: +---------------------+ vec InstancePtrHolder,A1> +---------+- __class__ | +---+ +---+ | | m_wrapped_objects -+->| *-+-->| *-+-+ B1 | +---------------------+ +---+ +---+ | +---+ | +->| | | ExtensionInstance +---+ | pb2_a1: +---------------------+ vec InstancePtrHolder,A1> +---------+- __class__ | +---+ +---+ | | m_wrapped_objects -+->| *-+-->| *-+-+ B2 | +---------------------+ +---+ +---+ | +---+ | +->| | | +---+ | ExtensionClass | A2: +------------+ | ()<--+- __bases__ | | | __dict__ -+->{...} | +------------+ | ^ | | ExtensionInstance | a2: | +---------------------+ vec InstanceValueHolder | +-+- __class__ | +---+ +-------------+ | | | m_wrapped_objects -+->| *-+-->| contains A2 | | | +---------------------+ +---+ +-------------+ | | | | ExtensionInstance | pa2_a2: | +---------------------+ vec InstancePtrHolder,A2> | +-+- __class__ | +---+ +---+ | | | m_wrapped_objects -+->| *-+-->| *-+-+ A2 | | +---------------------+ +---+ +---+ | +---+ | | +->| | | | ExtensionInstance +---+ | pb1_a2: | +---------------------+ vec InstancePtrHolder,A2> | +-+- __class__ | +---+ +---+ | | | m_wrapped_objects -+->| *-+-->| *-+-+ B1 | | +---------------------+ +---+ +---+ | +---+ | | +->| | | | +---+ | | | +---------------+------------------------------+ | | | +------+-------------------------+-|----------------------------+ | | | | | | | Class | | ExtensionClass | | ExtensionClass | DA1: +------------+ | | B1: +------------+ | | B2: +------------+ (*,)<---+- __bases__ | (*,*)<---+- __bases__ | (*,*)<---+- __bases__ | | __dict__ -+->{...} | __dict__ -+->{...} | __dict__ -+->{...} +------------+ +------------+ +------------+ ^ ^ ^ | ExtensionInstance | | | da1: +---------------------+ | vec InstanceValueHolder +-------+- __class__ | | +---+ +---------------------+ | | m_wrapped_objects -+--|-->| *-+-->| contains A_callback | | +---------------------+ | +---+ +---------------------+ | +--------------------------------------+ | | ExtensionInstance | b1: | +---------------------+ vec InstanceValueHolder | +-+- __class__ | +---+ +---------------------+ | | | m_wrapped_objects -+->| *-+-->| contains B_callback | | | +---------------------+ +---+ +---------------------+ | | | | ExtensionInstance | pb1_b1: | +---------------------+ vec InstancePtrHolder,B1> | +-+- __class__ | +---+ +---+ | | | m_wrapped_objects -+->| *-+-->| *-+-+ B1 | | +---------------------+ +---+ +---+ | +---+ | | +->| | | | ExtensionInstance +---+ | pc_b1: | +---------------------+ vec InstancePtrHolder,B1> | +-+- __class__ | +---+ +---+ | | | m_wrapped_objects -+->| *-+-->| *-+-+ C | | +---------------------+ +---+ +---+ | +---+ | | +->| | | | +---+ | | | | Class +---------------------------------------+ | DB1: +------------+ | ExtensionInstance (*,)<---+- __bases__ | a2: | +---------------------+ vec InstanceValueHolder | __dict__ -+->{...} +-+- __class__ | +---+ +-------------+ +------------+ | m_wrapped_objects -+->| *-+-->| contains A2 | ^ +---------------------+ +---+ +-------------+ | ExtensionInstance db1: | +---------------------+ vec InstanceValueHolder +-+- __class__ | +---+ +----------------------+ | m_wrapped_objects -+-->| *-+-->| contains B1_callback | +---------------------+ +---+ +----------------------+