comp.lang.ada
 help / color / mirror / Atom feed
From: "Hyman Rosen" <hyrosen@mail.com>
Subject: Re: Merits of re-dispatching [LONG]
Date: Thu, 7 Feb 2002 10:03:44 -0500
Date: 2002-02-07T10:03:44-05:00	[thread overview]
Message-ID: <1013094178.985786@master.nyc.kbcfp.com> (raw)
In-Reply-To: 3c62524f.93369796@News.CIS.DFN.DE

"Dmitry A. Kazakov" <dmitry@elros.cbb-automation.de> wrote in message news:3c62524f.93369796@News.CIS.DFN.DE...
> C++ and Ada 95 support re-dispatching, which I think is inherently unsafe.

I don't know about Ada, but there is nothing unsafe about C++'s "redispatching".

> Consider the following:
>
> type A is new Ada.Finalization.Limited_Controlled with ...
> procedure Foo  (Object : A);
> procedure Finalize (Object : in out A) ;
>
> Now let AA derived from A override Foo and Finalize:
>
> type AA is new A with record
>    ... -- Some components, which may use components of A
> end record;
> procedure Foo  (Object : AA) ;
> procedure Finalize (Object : in out AA) is
> begin
>    ... -- Finalize components, maybe accessing components of A
>    Finalize (A (Object)); -- Finalize parent
> end Finalize;

In C++, Foo(Object:AA) is *not* an overrider of Foo(Object:A),
just another function that happens to share the same name. If you
want to override Foo in AA, the parameter type must remain A.

> Consider the following implementation of A.Finalize:
>
> procedure Finalize (Object : in out A) is
> begin
>    Foo (A'Class (Object)); -- Re-dispatch to the child's Foo
> end Finalize;

Again, this is false for C++. In a C++ constructor or destructor, the
type of the object is the type of the class of which the constructor or
destructor is a member. So in the C++ equivalent of Finalize(A), the
call to Foo(A'Class) would call Foo(A), not Foo(AA), because in
the destructor of A, the object is an A, not an AA, even when we
are destructing the A component of an AA. This is good, since, as
you point out, the AA part is no longer there!

> Actually it is a common error among fresh baked C++ programmers
> to call virtual functions (dispatch) from constructors.

True, but the error is that (from their point of view) the wrong function
gets called, not that the right function gets called on destructed pieces
of objects.

I guess this is another entry for my "why C++ is better than Ada" file :-)
(Or maybe it's the first? :-)






  reply	other threads:[~2002-02-07 15:03 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-02-07 10:26 Merits of re-dispatching [LONG] Dmitry A. Kazakov
2002-02-07 15:03 ` Hyman Rosen [this message]
2002-02-08  1:29   ` Matthew Heaney
2002-02-08  9:16     ` Dmitry A. Kazakov
2002-02-08 18:30       ` Hyman Rosen
2002-02-09  0:10         ` Matthew Heaney
2002-02-12  8:32         ` Dmitry A. Kazakov
2002-02-12 21:37           ` Hyman Rosen
2002-02-13  9:29             ` Dmitry A. Kazakov
2002-02-13 14:32               ` Hyman Rosen
2002-02-13 19:58           ` Dave Harris
2002-02-14 15:06             ` Dmitry A. Kazakov
2002-02-16 12:10               ` Dave Harris
2002-02-18  8:57                 ` Dmitry A. Kazakov
2002-02-18 19:47                   ` Merits of re-dispatching Dave Harris
2002-02-19  9:20                     ` Dmitry A. Kazakov
2002-02-21  5:49                       ` Hyman Rosen
2002-02-21  9:04                         ` Dmitry A. Kazakov
2002-02-21 18:17                           ` Hyman Rosen
2002-02-22  9:21                             ` Dmitry A. Kazakov
2002-02-22 16:59                               ` Hyman Rosen
2002-02-25  8:51                                 ` Dmitry A. Kazakov
2002-02-08 23:51       ` Merits of re-dispatching [LONG] Matthew Heaney
2002-02-12  9:02         ` Dmitry A. Kazakov
2002-02-07 23:40 ` Nick Roberts
2002-02-08  8:56   ` Dmitry A. Kazakov
2002-02-08  1:06 ` Matthew Heaney
2002-02-08  9:48   ` Dmitry A. Kazakov
2002-02-09  0:16     ` Matthew Heaney
2002-02-08 18:10   ` Hyman Rosen
2002-02-09  0:41     ` Matthew Heaney
2002-02-08 18:33 ` Nick Roberts
2002-02-09  4:07   ` Nick Roberts
2002-02-12 10:13   ` Dmitry A. Kazakov
2002-02-14 20:57 ` Tucker Taft
2002-02-15 15:43   ` Dmitry A. Kazakov
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox