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.

Reply via email to