Dear Masaharu, > Dictionary size is already too big. I think it is better not doing > about change. I agree, that it is too much to increase already big dictionary. I was asking really about workaround. But it is probably too complicated. Actually I need it only for Streamer() but even for this only it is too much I tried to find workaround in C++ but also failed. In plain g++ i found TNamed tm("AAA","BBB") tm.TObject::Getname(); //gives "TNamed" which is correct but char *(TNamed::gn)(); gn = &TNamed::TObject::Getname; (tm.*gn)(); //gives "AAA" which is wrong Thank you, Victor Masaharu Goto wrote: > > Dear Victor, > > Thank you for reporting this problem. I found out the cause. The > problem occurs when you call a virtual function of a precompiled class > with scope operator. Unfortunately, this one will be left as it is. > Here is the reason. > > This is deeply related to dictionary operation. Cint is calling > wrapper function for TObject::GetName, but because it is a virtual > function, it ends up calling TNamed::GetName. I will explain in a simple > source. > > // user header //////////////////////////////////////////// > class A { > public: > virtual const char* GetName() const { return("base"); } > }; > class B : public A { > public: > const char* GetName() const { return("derived"); } > }; > > If you do makecint or rootcint on this header, dictionary would look like > below. > > // dictionary ///////////////////////////////////////////// > static int G__A_GetName_0_0( .... ) { > ... > const char* result = ((A*)obj)->GetName(); // virtual function call > ... > } > > static int G__B_GetName_0_0( .... ) { > .... > const char *result = ((B*)obj)->GetName(); // virtual function call > .... > } > > Cint calls G__B_GetName_0_0 for tn->GetName() and G__A_GetName_0_0 > for tn->TObject::GetName(). However, because A::GetName is a > virtual function, it resolves to B::GetName(). As cint distinguishes > two cases correctly, it is technically possible to solve this problem. > Problem is that we have to almost doulbe the dictionary size. > Every virtual function, we have to have virtual and non-virtual wrappers. > > // dictionary ///////////////////////////////////////////// > static int G__A_GetName_0_0( .... ) { > ... > const char* result = ((A*)obj)->GetName(); // virtual function call > ... > } > static int G__B_GetName_0_0( .... ) { > .... > const char *result = ((B*)obj)->GetName(); // virtual function call > .... > } > static int G__A_GetName_0_0_nonvirtual( .... ) { > ... > const char* result = ((A*)obj)->A::GetName(); // non virtual > ... > } > > static int G__B_GetName_0_0_nonvirtual( .... ) { > .... > const char *result = ((B*)obj)->B::GetName(); // non virtual > .... > } > > Dictionary size is already too big. I think it is better not doing > about change. > > Thank you > Masaharu Goto > > >Dear Masaharu, > > > >I found some discrepancy between CINT and C++ > > > > > >root [2] tn = new TNamed("AAA","BBB") > >root [3] tn->GetName() > >(Text_t* 0x85eb55c)"AAA" // It is correct > >root [4] tn->TObject::GetName() > >(Text_t* 0x85eb55c)"AAA" // It is incorrect > > > >C++ gives > > AAA for first case; > > TNamed for second; > > > >Is it hard to fix, or may be there is some workaround? > > > >Generally I need to call method of base class in CINT or by > >G__ClassInfo family. > > > >Victor > > > >-- > >Victor M. Perevoztchikov perev@bnl.gov perev@vxcern.cern.ch > >Brookhaven National Laboratory MS 510A PO Box 5000 Upton NY 11973-5000 > >tel office : 631-344-7894; fax 631-344-4206; home 631-345-2690 -- Victor M. Perevoztchikov perev@bnl.gov perev@vxcern.cern.ch Brookhaven National Laboratory MS 510A PO Box 5000 Upton NY 11973-5000 tel office : 631-344-7894; fax 631-344-4206; home 631-345-2690
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:43 MET