From: Martin Krischik <krischik@users.sourceforge.net>
Subject: Re: private classes
Date: Sun, 03 Oct 2004 18:36:21 +0200
Date: 2004-10-03T18:36:21+02:00 [thread overview]
Message-ID: <7036140.cAlS8YMQ4m@linux1.krischik.com> (raw)
In-Reply-To: cjn3e9$moq$05$1@news.t-online.com
Rick Santa-Cruz wrote:
> Hi,
>
> sorry for so many question, but always when I thought I understand it, I
> read further and see a new problem... so given the following source-code:
> package Classes is
> type Base_1 is tagged private;
>
> type Derived_1 is new Base_1 with private;
>
> procedure Proc(B: Base_1);
>
> private
> type Base_1 is tagged record
> Number: Integer;
> end record;
>
> type Derived_1 is new Base_1 with null record;
> end Classes;
>
> package body Classes is
> procedure Proc(b: Base_1) is
> begin
> null;
> end Proc;
> end Classes;
>
> with Classes;
>
> procedure main is
> D: Classes.Derived_1;
D_Class : Classes.Base_1'Base renames Classes.Base_1'Base (D);
> begin
> Classes.Proc(D);
Classes.Proc(D_Class);
> end Main;
>
> I get an error in calling Classes.Proc(D). Although I thought that cause
> Derived_1 inherits from Base_1 the call should be possible. In fact
> exactly this I found in the book from John English in chapter 14.5. Why
> can't I compile such, although I thought the function Proc is visible for
> clients of the package Classes.
It's the strong typing in Ada. For a C++ programmer used to using pointers
and references which convert itself this might come as a suprise. Here you
should remember that "this" is indeed a pointer.
> My second question is then, if the above does not work
Well it does work with the fix I have made. You should note that Ada does
not automaticly slice objects. This has advantages and disadvantages. I
show you the advantage:
type Base_1_Access is access Base_1;
D_Pointer = new Base_1'(D_Class);
In C++ the operator new would slice D down to Base_1 - that is all the
Derived_1 information will be lost and only the copy constructor of Base_1
is called. In Ada it isn't. Ada will copy the complete object and use the
Adjust from Derived_1. And that allows for the equivalent of "vector
<Base_1>" to be as usefull as "vector <Base_1*>".
{Ada.Containers.Vector will be added in Ada 2005 - Test versions are
available on the net.}
As a price you pay for this quite handy feature you need to use Base_1'Base
whenever you don't know what actual class an object could be.
With Regards
Martin
--
mailto://krischik@users.sourceforge.net
http://www.ada.krischik.com
prev parent reply other threads:[~2004-10-03 16:36 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-10-02 20:35 private classes Rick Santa-Cruz
2004-10-02 21:12 ` Rick Santa-Cruz
2004-10-03 19:11 ` Ludovic Brenta
2004-10-03 16:36 ` Martin Krischik [this message]
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox