SGI C++ 2.0 Polymorphic Reference Bug

Mark Linton linton at sgi.com
Wed Mar 13 11:56:08 AEST 1991


In article <1991Mar12.213359.25893 at odin.corp.sgi.com>, robert at texas.asd.sgi.com (Robert Skinner) writes:
|> In article <1688 at contex.UUCP>, jeff at contex.UUCP (Jeff Carey) writes:
|> |> 
|> |> The other day I was testing the code found in the discussion
|> |> of "Virtual Base Classes with Virtual Functions", section 10.10c, pp. 233-4,
|> |> of _The_Annotated_C++_Reference_Manual_ and found the following bug.  You'll
|> |> notice that the bug is in the call made to f() from the MW object reference
|> |> (MW&).
|> |> 
|> |> ---------------------- beginning of test.c++ code ----------------------------
|> |> 
|> |> #include <iostream.h>
|> |> 
|> |> class W { public: virtual void f() { cout << "W::f\n"; } };
|> |> 
|> |> class MW : public virtual W {};
|> |> 
|> |> class BW : public virtual W { public: void f() { cout << "BW::f\n"; } };
|> |> 
|> |> class BMW : public BW, public MW {};
|> |> 
|> |> main()
|> |> {
|> |>     BMW bmw;
|> |> 
|> |>     MW* pmw = &bmw;
|> |>     pmw->f();
|> |> 
|> |>     MW& rmw = bmw;
|> |>     rmw.f();
|> |> 
|> |>     return(0);
|> |> }
|> |> 
|> |> ----------------------------- end of test code -------------------------------
|> |> 
|> |> I got this result:
|> |> 
|> |> $ test
|> |> BW::f
|> |> W::f
|> |> 
|> |> I would have predicted and hoped that the two lines of diagnostics would
|> |> result in the same text.
|> |> This is a bug isn't it...polymorphism of this sort should be supported by
|> |> references as well as pointers, right?!
|> |> 
|> |> Ouch ---
|> |> jeff
|> |> -- 
|> |> ------------------------
|> |> Jeff Carey
|> |> contex!jeff at uunet.uu.net
|> 
|> 
|> no, its not a bug.  I'll let one of our compiler wizards explain the
|> details, but here's my rationalization:

This _is_ a bug.  If you remove the multiple inheritance, it behaves
as you would expect (prints BW::f twice).  Note this bug still exists
in cfront 2.1 as it comes from AT&T.

|> Polymorphism is only supported for pointers, where the compiler doesn't
|> really know what subclass the pointer really points at.

Not true.  If that were so, then reference parameters would be pretty useless.
>From the ARM, page 209, bottom third:

     ... When a virtual function is called through a pointer or reference, the actual
     type of the object is not necessarily known, so the virtual call mechanism
     must be used.



More information about the Comp.sys.sgi mailing list