This is almost the same code as written initially, let somone explain why the hell this is working:--- module test; import std.conv; class Parent { @property final string typeName() { return to!string(this); } } class Child : Parent { } void main() { auto p = new Parent; auto c = new Child; assert(p.typeName == __MODULE__ ~ ".Parent"); assert(c.typeName == __MODULE__ ~ ".Child"); } ---
Because to!string calls toString, which is a virtual function. It's the same as the NVI-Idiom in C++.