Path: utzoo!news-server.csri.toronto.edu!rutgers!usc!elroy.jpl.nasa.gov!decwrl!sgi!shinobu!odin!sgi.com!linton From: linton@sgi.com (Mark Linton) Newsgroups: comp.sys.sgi Subject: Re: SGI C++ 2.0 Polymorphic Reference Bug Keywords: SGI PI C++ 2.0 polymophism reference bug Message-ID: <1991Mar13.015608.1334@odin.corp.sgi.com> Date: 13 Mar 91 01:56:08 GMT References: <1688@contex.UUCP> <1991Mar12.213359.25893@odin.corp.sgi.com> Sender: news@odin.corp.sgi.com (Net News) Reply-To: linton@sgi.com (Mark Linton) Organization: sgi Lines: 71 In article <1991Mar12.213359.25893@odin.corp.sgi.com>, robert@texas.asd.sgi.com (Robert Skinner) writes: |> In article <1688@contex.UUCP>, jeff@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 |> |> |> |> 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: 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.