On 09/24/15 13:26, Marc Schütz via Digitalmars-d-learn wrote: > On Thursday, 24 September 2015 at 01:01:09 UTC, Nicholas Wilson wrote: >> On Wednesday, 23 September 2015 at 21:25:15 UTC, tcak wrote: >>> On Wednesday, 23 September 2015 at 21:14:17 UTC, Adam D. Ruppe wrote: >>>> On Wednesday, 23 September 2015 at 21:08:37 UTC, tcak wrote: >>>>> I wouldn't expect B's constructor to be called at all unless "super" is >>>>> used there. >>>> >>>> "If no call to constructors via this or super appear in a constructor, and >>>> the base class has a constructor, a call to super() is inserted at the >>>> beginning of the constructor. " >>>> >>>> >>>> from http://dlang.org/class.html#constructors >>>> >>>> the idea is to make sure the base class construction work is done too. >>> >>> Is there any way to prevent this behaviour? >>> >>> Quickly checked whether Java acts in the same way. Answer is yes. >> >> You might be able to swap out the vtbl entry for a stub call it and trick >> the compiler and swap it back, but... > > Urgh... > > If you can modify the base class, and you really need it, you can check the > dynamic type: > > class Base { > this() { > if(!cast(Base) this) return; > // do the initialization > } > }
If you're going to do this then you can just use overloading. That will both avoid the runtime check and require the hack to be explicitly enabled in the derived class. IOW: class B { this() { writeln("B.constructor"); foo(); } struct SkipBCtor {} this(SkipBCtor) {} void foo() { writeln("B.foo"); } } class D : B { this() { super(SkipBCtor()); writeln("D.constructor"); } override void foo() { writeln("D.foo overrides B.foo"); } } artur