[ROOT] Problem with casting in CINT

From: Vladimir Pechenov (pechenov@gsi.de)
Date: Sun May 19 2002 - 15:54:04 MEST


Hello Rooters,

I have found the problem with casting for classes which are inherited form
two classes.
Let's  take class TH3 for example   (class TH3 : public TH1, public TAtt3D)
and try to get pointer to the object of the TAtt3D class:

void test(void) {
  TH3* pH3=new TH3;
  TAtt3D* pAtt3D;
  printf("\n--------TH3*= %+8x\n\n",pH3);
  for(Int_t i=0; i<3; i++) {
    pAtt3D=dynamic_cast<TAtt3D*>(pH3); printf("1_%i_1: TAtt3D*=
%+8x\n",i,pAtt3D);
    pAtt3D=dynamic_cast<TAtt3D*>(pH3); printf("1_%i_2: TAtt3D*=
%+8x\n",i,pAtt3D);
    pAtt3D=dynamic_cast<TAtt3D*>(pH3); printf("1_%i_3: TAtt3D*=
%+8x\n\n",i,pAtt3D);
  }
  for(Int_t i=0; i<3; i++) {
    pAtt3D=(TAtt3D*)pH3; printf("2_%i_1: TAtt3D*= %+8x\n",i,pAtt3D);
    pAtt3D=(TAtt3D*)pH3; printf("2_%i_2: TAtt3D*= %+8x\n",i,pAtt3D);
    pAtt3D=(TAtt3D*)pH3; printf("2_%i_3: TAtt3D*= %+8x\n\n",i,pAtt3D);
  }
}

The output will:

--------TH3*=  8d61250

1_0_1: TAtt3D*=  8d61488     ok.
1_0_2: TAtt3D*=  8d61488     ok.
1_0_3: TAtt3D*=  8d61488     ok.

1_1_1: TAtt3D*=  8d61250    it's pointer to TH3 but not to TAtt3D
1_1_2: TAtt3D*=  8d61250    it's pointer to TH3 but not to TAtt3D
1_1_3: TAtt3D*=  8d61250    it's pointer to TH3 but not to TAtt3D

1_2_1: TAtt3D*=  8d61250    it's pointer to TH3 but not to TAtt3D
1_2_2: TAtt3D*=  8d61250    it's pointer to TH3 but not to TAtt3D
1_2_3: TAtt3D*=  8d61250    it's pointer to TH3 but not to TAtt3D

2_0_1: TAtt3D*=  8d61488     ok.
2_0_2: TAtt3D*=  8d61488     ok.
2_0_3: TAtt3D*=  8d61488     ok.

2_1_1: TAtt3D*=  8d61250    it's pointer to TH3 but not to TAtt3D
2_1_2: TAtt3D*=  8d61250    it's pointer to TH3 but not to TAtt3D
2_1_3: TAtt3D*=  8d61250    it's pointer to TH3 but not to TAtt3D

2_2_1: TAtt3D*=  8d61250    it's pointer to TH3 but not to TAtt3D
2_2_2: TAtt3D*=  8d61250    it's pointer to TH3 but not to TAtt3D
2_2_3: TAtt3D*=  8d61250    it's pointer to TH3 but not to TAtt3D

In compiled code it's work

I see also some problems with reading  such kind of objects from
root file by TBrowser. Some times I have wrong resalts some times
 *** Break *** segmentation violation

Best regards,
               Vladimir.



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:53 MET