[gnu.g++.help] help! with multiple inheritance

spolsky-joel@CS.YALE.EDU (Joel Spolsky) (12/18/90)

Hi, Perhaps some kind soul can tell me why this program fragment
doesn't work?  I am trying to use a base pointer and get the correct
derived method, but this doesn't work when the base pointer has been
cast to a void * and then back to the base pointer. 

[Why, you may ask, do I need to cast this through a void pointer?
well, because I am using InterViews, and I am using InterViews
"Pictures" to store things, and when I get them back they have been
cast into Graphic *'s, so I have to cast them back, but by then the
derived methods don't work. Arg!]

(I'm using g++ version 1.37.1 for Sun SPARC station, Sun OS 4.0)

#include "std.h"

class a {int x;};
class b {float x,y;};
class Tiger {
  public:
    virtual void Roar (void)
	{printf("roar\n");}
};

class Bengal: public a, public Tiger{
  public:
    virtual void Roar (void)
	{printf("bengal roar\n");}
};

class Senegal: public b, public Tiger{
  public:
    virtual void Roar (void)
	{printf("senegal roar\n");}
};


main()
{
    Senegal *ps = new Senegal;


//  This works, printing "senegal roar":
    printf("cast to Tiger *:\n");
    ((Tiger *) ps)->Roar();


//  This segment faults:
    printf("cast thru:\n");
    ((Tiger *) (void *) ps)->Roar();

}


Note: There is no problem if Bengal and Senegal do _not_ multiple
inherit.

Thanks in advance for your help,

--
Joel Spolsky          // And these streets, Quiet as a sleeping army
spolsky@cs.yale.edu   // Send their battered dreams to heaven.   _Paul Simon