Path: utzoo!utgpu!news-server.csri.toronto.edu!rutgers!cs.utexas.edu!usc!elroy.jpl.nasa.gov!decwrl!sgi!shinobu!odin!texas.asd.sgi.com!robert From: robert@texas.asd.sgi.com (Robert Skinner) Newsgroups: comp.sys.sgi Subject: Re: SGI C++ 2.0 Polymorphic Reference Bug Keywords: SGI PI C++ 2.0 polymophism reference bug Message-ID: <1991Mar12.213359.25893@odin.corp.sgi.com> Date: 12 Mar 91 21:33:59 GMT References: <1688@contex.UUCP> Sender: news@odin.corp.sgi.com (Net News) Reply-To: robert@sgi.com Organization: Silicon Graphics Inc., Advanced Systems Division Lines: 83 In article <1688@contex.UUCP>, jeff@contex.UUCP (Jeff Carey) writes: |> |> I am using: |> |> System release: IRIX Release 4D1-3.3.1 |> C++ release: S4-C++-2.0 |> Software Option: C++ Translator Version 2.0 |> |> on a Silicon Graphics PI. |> 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 |> |> 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@uunet.uu.net no, its not a bug. I'll let one of our compiler wizards explain the details, but here's my rationalization: You've declared rmw to be a MW, and the compiler treats it as one, calling MW::f() directly. (I think of the '&' operator as a convenience. I really don't know what effect it has here.) Polymorphism is only supported for pointers, where the compiler doesn't really know what subclass the pointer really points at. -- Robert Skinner robert@sgi.com Some rich men came and raped the land, nobody caught 'em. Put up a bunch of ugly boxes, and Jesus people bought 'em. They call it Paradise, I don't know why. You call someplace Paradise, kiss it goodbye. - The Eagles