On Friday, 25 July 2025 at 03:57:34 UTC, Andy Valencia wrote:
On Friday, 25 July 2025 at 02:40:35 UTC, H. S. Teoh wrote:
In D, constructors are not inherited, so yes, unfortunately
you have to write a forwarding ctor that passes the arguments
along to the base class.
My OO worldview goes back to Smalltalk, where constructors are
"just" methods and thus you can reason about them as you would
any other inherited method. I see the point of nudging
explicit treatment of superclass constructors. Is it nannying?
A bit. Nothing that would make me walk away from D. And I
appreciate this extra insight into how D looks at constructors.
Thank you--both of you!
Andy
For a more technical explanation; in D constructors don’t live in
the class vtable. So they can never be virtual. As such
constructors are only OOP at compile time. This is why you need
to call super constructors explicitly; otherwise you could end up
corrupting state of objects you’ve inherited from.
Constructors do have entries in the Runtime Type Info
(TypeInfo_Class) but those are seperate static instances from the
overall class vtable (though vtable entry 0 points to the type
info usually)
You can of course also break the type system if you really want
to; but I’d recommend against doing so.