spir: > class SC { > string f = "SC"; > void show() {writeln(this.f);} > } > class C : SC { > string f = "C"; > } > void main () { > auto c = new C(); > writeln(c.f) ; // OK, got "C" > c.show() ; // expected "C", got "SC" > > // below test for type > if (is(typeof(c) == C)) {writeln("type C");} else {writeln("type SC");} > auto sc = new SC(); > if (is(typeof(sc) == C)) {writeln("type C");} else {writeln("type SC");} > }
Java acts as D here: http://ideone.com/LcAll C# requires the new keyword: http://ideone.com/AVFvI A D version that does as you desire: import std.stdio; class SC { string f_ = "SC"; @property string f() { return f_; } void show() { writeln(this.f); } } class C : SC { string f_ = "C"; @property override string f() { return f_; } } void main () { auto c = new C(); writeln(c.classinfo.name); auto sc = new SC(); writeln(sc.classinfo.name); writeln(c.f); // "C" c.show(); // "C" } Bye, bearophile