On Thu, 03 Dec 2009 11:01:29 +0100, Qian Xu <qian...@funkwerk-itk.com> wrote:
>Hi All, > >I want to print some object information for debugging. But the name of class >is incorrect. I do not know why. > > >module test; > >class A { > char[] data; > public char[] toString() { > return "<" + this.classinfo.name + ": " + data + ">"; > } >} > >class B: A { > char[] data2; > public override char[] toString() { > return "<" + this.classinfo.name + ": " + super.toString + ", " + data2 >+ ">"; > } >} > >auto b = new B; >b.data = "hello"; >b.data2 = "world"; >Cout(b.toString); // <test.B: <test.B: hello>, world> > > >The expected result should be: ><test.B: <test.A: hello>, world> > >But the actual result is: ><test.B: <test.B: hello>, world> > > this.classinfo can be seen as a virtual function returning the classinfo for the actual class instance and typeof(this).classinfo - as a static function returning the classinfo of the compile-time type of this (that is the class where it is called). So, your example should be rewritten (D2): import std.stdio; class A { string data; public string toString() { return "<" ~ typeof(this).classinfo.name ~ ": " ~ data ~ ">"; } } class B: A { string data2; public override string toString() { return "<" ~ typeof(this).classinfo.name ~ ": " ~ super.toString ~ ", " ~ data2 ~ ">"; } } void main() { auto b = new B; b.data = "hello"; b.data2 = "world"; writeln(b.toString); }