[comp.lang.c++] Fairly simple Multiple Inheritance Question

jdg@sisd.kodak.com (Jeff Gortatowsky CUST) (07/25/90)

Like many others I'm just getting started using g++ and TC++. Here's
the question in code (shortened quite a bit).

class A { .......  };
class B { ......   };
// C inherits A and B
class C : public A, public B { .... };   // Note: has class B
// D inherits only A
class D : public A { ..... };            // Note: no class B

// E should have everthing.  2 copies of A?? Better fix that virtually!
class E : public C, public D { .... };

main ()
{
	E myObject();  // Construct a class E object
	B *ptrToB;      // Pointer to class B object

	ptrToB = &myObject;       // Illegal????  TC++ say it is.
	ptrToB = (B *) &myObject; // legal????
}

Is the first assignment legal?  One of the base classes of class E is 
class C which did inherit a class B object.  However the other class
inherited by class E was class D which did not inherit a class B object.
Is that why the first assignment is wrong?  The second works, it
even runs right.  I just want to know why if there is a base class
object of type B in an object of class E I can't use a base class pointer
without a cast. Please excuse any obvious stupidity on my part, I'm
just starting to make the shift.

--
Jeff Gortatowsky-Eastman Kodak Company  .....uunet!atexnet!kodak!elmgate!jdg
(716)-726-0084
Eastman Kodak makes film not comments.  Therefore these comments are mine
not theirs.

jeh@cs.rit.edu (Jim Heliotis) (08/02/90)

From article <1990Jul25.121614.16958@sisd.kodak.com>, by jdg@sisd.kodak.com (Jeff Gortatowsky CUST):
> 
> class A { .......  };
> class B { ......   };
> class C : public A, public B { .... };
> class D : public A { ..... };
> class E : public C, public D { .... };
> 
> main ()
> {
> 	E myObject();  // Construct a class E object
> 	B *ptrToB;      // Pointer to class B object
> 
> 	ptrToB = &myObject;       // Illegal????  TC++ say it is.
> }

I ran this under cfront 2.1.  Note the error it gives:

CC mi.C
AT&T C++ Compiling System, v2.1
CC  mi.C:
"mi.C", line 17: error: no standard conversion of  E (*)() to  B *
1 error

"E myObject();" is the declaration of a function; "E myObject;" would be
the declaration of an object variable, initialized by a parameterless
constructor (which, by the way, compiles fine)!

				Jim Heliotis
				Rochester Institute of Technology
				Rochester, NY 14623-0887
				jeh@CS.RIT.EDU
				{allegra,seismo}!rochester!rit!jeh