From: dmitry@elros.cbb-automation.de (Dmitry A. Kazakov)
Subject: Re: Merits of re-dispatching [LONG]
Date: Thu, 14 Feb 2002 15:06:41 GMT
Date: 2002-02-14T15:06:41+00:00 [thread overview]
Message-ID: <3c6bcb27.4632484@News.CIS.DFN.DE> (raw)
In-Reply-To: memo.20020213195841.65507A@brangdon.madasafish.com
On Wed, 13 Feb 2002 19:58 +0000 (GMT Standard Time),
brangdon@cix.co.uk (Dave Harris) wrote:
>dmitry@elros.cbb-automation.de (Dmitry A. Kazakov) wrote (abridged):
>> That is one of several possible interpretation of what happens in C++
>> using Ada terms. However, I prefer mine, because it is consistent with
>> the fact that the type tag [= vtab] is constant, thus the actual
>> specific type is also constant.
>> [...]
>> When you pass it to some other routine an implicit specific->class
>> wide conversion happens, so the routine can dispatch again.
>
>This doesn't work. If you look at the 3 calls to call_foo() in Hyman
>Rosen's example, you'll see it dispatches to 3 different places. Therefore
>we cannot view the object has having a constant type with 2 kinds of
>dispatching. A specific->class-wide conversion would have it printing
>C::foo 2 or 3 times. Your view doesn't match the visible behaviour.
>
>If you think in terms of a conversion, the different calls to call_foo()
>must convert to different types. It's not enough to switch the vtable on
>and off, you need different conceptual vtables.
Yes. C has a tag, B in C has another and A in B in C has the third.
This is why I do not like embedded tags.
>Given this, its simpler to think of the conversion as happening as soon as
>the constructor is entered, rather than when the constructor calls out.
Surely. There is a type conversion, but it is an "in-place"
conversion. It changes neither the object C nor its type. It only
shifts the reference to C.B.
>> An Ada 95 equivalent would be:
>
>Your example only shows 2 types, so doesn't capture the richness of
>behaviour of Hyman's example which has 3. I suspect you have misunderstood
>it.
That there are three types changes nothing. It works pretty well in
Ada 95:
type A is ...
procedure Foo (Object : A) is
begin
Put_Line ("A.Foo");
end Foo;
procedure Finalize (Object : in out A) is
begin
Foo (Object); -- No dispatch here, A.Foo is called
end Finalize;
--------------------
type B is new A ...
procedure Foo (Object : B) is
begin
Put_Line ("B.Foo");
end Foo;
procedure Finalize (Object : in out B) is
begin
Foo (Object); -- No dispatch here, B.Foo is called
Finalize (A (Object)); -- C++ adds this automatically
end Finalize;
---------------------------
type C is new B...
procedure Foo (Object : C) is
begin
Put_Line ("C.Foo");
end Foo;
procedure Finalize (Object : in out C) is
begin
Foo (Object); -- No dispatch here, C.Foo is called
Finalize (B (Object)); -- C++ adds this automatically
end Finalize;
When C is finalized, then C.Foo, B.Foo, A.Foo will be printed.
Regards,
Dmitry Kazakov
next prev parent reply other threads:[~2002-02-14 15:06 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
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 [this message]
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