Does the {.inheritable.} pragma convert an object into a pointer or keep it as 
a normal object with copy semantics?

Also, something to bear in mind, upon testing this it seems the type is erased 
when inserting into a seq: (Nim version 0.17.3 2017-10-13)
    
    
    import typetraits
    
    type
      Obj1 = object {.inheritable.}
        a: int
      Obj2 = object of Obj1
        b: float
    
    var
      x = newSeq[Obj1]()
    
    x.add Obj1(a: 1)
    x.add Obj2(a: 2, b: 3.5) # This is allowed
    
    echo x[1].type.name  # output Obj1, not Obj2
    echo Obj2(x[1])      # This fails at run time with invalid object 
conversion, Obj2's extra fields are lost
    

Should the compiler warn that putting an Obj2 into a seq of Obj1 will drop it's 
extra data? Or is the extra data meant to be there but there's a bug somewhere?

With a ref, the type is obscured but internally preserved as expected:
    
    
    import typetraits
    type
      ARef1 = ref object of RootObj
        a: int
      ARef2 = ref object of ARef1
        b: float
    
    var
      y = newSeq[ARef1]()
    
    y.add ARef1(a: 1)
    y.add ARef2(a: 2, b: 4.5)
    
    # output ARef1, not ARef2 (probably because 'type' is compiletime)
    echo y[1].type.name
    # displays data as ARef2 as expected, data is preserved - assuming you can 
cast appropriately at runtime
    echo ARef2(y[1]).repr
    

Reply via email to