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<B> is derived from
Class<ExtensionInstance>, and is in fact identical for all intents and purposes.

                                           MetaClass<ExtensionInstance>
                 +---------+              +---------+                  
types.ClassType: |         |              |         |                  
                 |         |              |         |                  
                 |         |              |         |                  
                 +---------+              +---------+                    
                   ^                         ^   ^
     PyClassObject |       ExtensionClass<B> |   |
 A: +------------+ |   B: +------------+     |   |
    |  ob_type  -+-+      |   ob_type -+-----+   |
    |            |   ()<--+- __bases__ |         |
    |            |        |  __dict__ -+->{...}  |
    |            |   'B'<-+- __name__  |         |
    +------------+        +------------+         |
         ^                      ^                |
         |                      |                |
         +-----+  +-------------+                |
               |  |                              |
               |  |     Class<ExtensionInstance> |
               |  | C: +------------+            |
               |  |    |   ob_type -+------------+
        tuple:(*, *)<--+- __bases__ |           
                       |  __dict__ -+->{__module__, <methods, etc.>}
                 '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<InstanceHolderBase> 
             +----+- __class__          |  +---+--  
                  |  m_wrapped_objects -+->| * | ...
        {'x': 1}<-+- __dict__           |  +-|-+--   
                  +---------------------+    |    InstanceValueHolder<B>                  
                                             |   +--------------------------------+
                                             +-->| (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>
  A1: +------------+                
 ()<--+- __bases__ |                                                
      |  __dict__ -+->{...}                                         
      +------------+                                                
        ^                 
        |          ExtensionInstance                                              
        |     a1: +---------------------+   vec     InstanceValueHolder<A1,A_callback> 
        +---------+- __class__          |  +---+   +---------------------+ 
        |         |  m_wrapped_objects -+->| *-+-->| contains A_callback | 
        |         +---------------------+  +---+   +---------------------+              
        |   
        |          ExtensionInstance                                              
        | pa1_a1: +---------------------+   vec     InstancePtrHolder<auto_ptr<A1>,A1>
        +---------+- __class__          |  +---+   +---+ 
        |         |  m_wrapped_objects -+->| *-+-->| *-+-+   A1    
        |         +---------------------+  +---+   +---+ |  +---+
        |                                                +->|   |
        |          ExtensionInstance                        +---+ 
        | pb1_a1: +---------------------+   vec     InstancePtrHolder<auto_ptr<A1>,A1>
        +---------+- __class__          |  +---+   +---+                 
        |         |  m_wrapped_objects -+->| *-+-->| *-+-+   B1           
        |         +---------------------+  +---+   +---+ |  +---+        
        |                                                +->|   |                            
        |          ExtensionInstance                        +---+                       
        | pb2_a1: +---------------------+   vec     InstancePtrHolder<auto_ptr<A1>,A1>
        +---------+- __class__          |  +---+   +---+                 
        |         |  m_wrapped_objects -+->| *-+-->| *-+-+   B2                   
        |         +---------------------+  +---+   +---+ |  +---+        
        |                                                +->|   | 
        |                                                   +---+                       
        |       ExtensionClass<A1>                                                          
        |  A2: +------------+                                                               
        | ()<--+- __bases__ |                                                               
        |      |  __dict__ -+->{...}                                                        
        |      +------------+                                                               
        |           ^                                                                       
        |           |  ExtensionInstance                                                    
        |       a2: | +---------------------+   vec     InstanceValueHolder<A2>             
        |           +-+- __class__          |  +---+   +-------------+                      
        |           | |  m_wrapped_objects -+->| *-+-->| contains A2 |                      
        |           | +---------------------+  +---+   +-------------+                      
        |           |                                                                       
        |           |  ExtensionInstance                                                    
        |   pa2_a2: | +---------------------+   vec     InstancePtrHolder<auto_ptr<A2>,A2>  
        |           +-+- __class__          |  +---+   +---+                                
        |           | |  m_wrapped_objects -+->| *-+-->| *-+-+   A2                         
        |           | +---------------------+  +---+   +---+ |  +---+                       
        |           |                                        +->|   |                       
        |           |  ExtensionInstance                        +---+                       
        |   pb1_a2: | +---------------------+   vec     InstancePtrHolder<auto_ptr<A2>,A2>  
        |           +-+- __class__          |  +---+   +---+                                
        |           | |  m_wrapped_objects -+->| *-+-->| *-+-+   B1                         
        |           | +---------------------+  +---+   +---+ |  +---+                       
        |           |                                        +->|   |                       
        |           |                                           +---+                       
        |           |                                                                       
        |           +---------------+------------------------------+                             
        |                           |                              |                             
 +------+-------------------------+-|----------------------------+ |                             
 |                                | |                            | |                             
 |       Class<ExtensionInstance> | |      ExtensionClass<B1>    | |      ExtensionClass<B1>     
 | DA1: +------------+            | | B1: +------------+         | | B2: +------------+          
(*,)<---+- __bases__ |           (*,*)<---+- __bases__ |        (*,*)<---+- __bases__ |          
        |  __dict__ -+->{...}             |  __dict__ -+->{...}          |  __dict__ -+->{...}   
        +------------+                    +------------+                 +------------+          
              ^                                ^                                    ^ 
              |        ExtensionInstance       |                                    |       
              |  da1: +---------------------+  |    vec     InstanceValueHolder<A1,A_callback>  
              +-------+- __class__          |  |   +---+   +---------------------+  |          
                      |  m_wrapped_objects -+--|-->| *-+-->| contains A_callback |  |          
                      +---------------------+  |   +---+   +---------------------+  |          
        +--------------------------------------+                                    |
        |  ExtensionInstance                                                        |
    b1: | +---------------------+   vec     InstanceValueHolder<B1,B_callback>      |
        +-+- __class__          |  +---+   +---------------------+                  |
        | |  m_wrapped_objects -+->| *-+-->| contains B_callback |                  |
        | +---------------------+  +---+   +---------------------+                  |
        |                                                                           |
        |  ExtensionInstance                                                        |
pb1_b1: | +---------------------+   vec     InstancePtrHolder<auto_ptr<B1>,B1>      |
        +-+- __class__          |  +---+   +---+                                    |
        | |  m_wrapped_objects -+->| *-+-->| *-+-+   B1                             |
        | +---------------------+  +---+   +---+ |  +---+                           |
        |                                        +->|   |                           |
        |  ExtensionInstance                        +---+                           |
 pc_b1: | +---------------------+   vec     InstancePtrHolder<auto_ptr<B1>,B1>      |
        +-+- __class__          |  +---+   +---+                                    |
        | |  m_wrapped_objects -+->| *-+-->| *-+-+   C                              |
        | +---------------------+  +---+   +---+ |  +---+                           |
        |                                        +->|   |                           |
        |                                           +---+                           |
        |                                                                           |
        |       Class<ExtensionInstance>    +---------------------------------------+
        | DB1: +------------+               |  ExtensionInstance                                                    
       (*,)<---+- __bases__ |           a2: | +---------------------+   vec     InstanceValueHolder<A2> 
               |  __dict__ -+->{...}        +-+- __class__          |  +---+   +-------------+                      
               +------------+                 |  m_wrapped_objects -+->| *-+-->| contains A2 |                      
                     ^                        +---------------------+  +---+   +-------------+                      
                     |  ExtensionInstance      
                db1: | +---------------------+    vec     InstanceValueHolder<B1,B_callback>  
                     +-+- __class__          |   +---+   +----------------------+ 
                       |  m_wrapped_objects -+-->| *-+-->| contains B1_callback |              
                       +---------------------+   +---+   +----------------------+              
