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