comp.lang.ada
 help / color / mirror / Atom feed
From: Adam Beneschan <adam@irvine.com>
Subject: Re: type access Parent'Class
Date: Mon, 21 Nov 2011 11:25:14 -0800 (PST)
Date: 2011-11-21T11:25:14-08:00	[thread overview]
Message-ID: <cf11dc37-33a6-4c62-bfd9-4165e6f83dd5@h30g2000pro.googlegroups.com> (raw)
In-Reply-To: 7fd768a4-f97b-4045-8bab-49d2a3897a61@p2g2000vbj.googlegroups.com

On Nov 21, 11:03 am, Yukicanis <yukica...@googlemail.com> wrote:
> Dear Group,
>
> I'm new to Ada and currently playing around with its OOP features.
> Now, I have the following source:
>
> procedure Test is
>   type Parent is tagged limited null record;
>   type Parent_Access is access Parent'Class;
>   A : access Parent'Class;
>   B : Parent_Access;
>   procedure Dyn_Disp(X : access Parent'Class) is
>   begin
>     A := X;
>     B := X;
>   end Dyn_Disp;
> begin
>   null;
> end Test;
>
> When I try to complie that with GNAT 4.6.1 I get the following error
> message:
>
> test.adb:9:10: expected type "Parent_Access" defined at line 3
> test.adb:9:10: found type access to "Parent'Class" defined at line 6
>
> which I don't really understand since type "Parent_Access" is type
> access to Parent'Class, isn't it?
>
> Thanks in advance.

Ada is a strongly typed language.  That means that you can have two
types that look exactly the same but are still different types,
because you've declared them as different types, and you can't just
use them interchangeably.  Example:

  type Acc_Type_1 is access all Integer;
  type Acc_Type_2 is access all Integer;
  V1 : Acc_Type_1;
  V2 : Acc_Type_2;

  V1 := V2;     -- ILLEGAL!

This is illegal because V1 and V2 have different types, even though
the types look the same.  You have to use a type conversion:

  V1 := Acc_Type_1(V2);  -- LEGAL

This doesn't have anything to do with access types, by the way.  All
types in Ada are like that.

In your original example, "access Parent'Class" is an anonymous type,
and every time an anonymous type occurs, it's a new type.  So that's
why

  B := X;

is illegal.  You have to use a type conversion:

  B := Parent_Access(X);

That still won't quite work, because anonymous access types are
"general" access types and their values can point to any aliased
Parent'Class object.  However, Parent_Access is called a "pool-
specific" access type because it can only point to objects that are
allocated with "new".  To make Parent_Access a general access type,
add an "all":

  type Parent_Access is access all Parent'Class;

and now your example will compile.  In my view, there isn't much
reason *not* to use "all" in an access type declaration, and I've
gotten in the habit of including it routinely.  (But you can't use
"all" like this if it's not in a TYPE declaration.)

The language allows

  A := X;

even though A and X have different types, because there's no way to
write a type conversion.  This is an exception to the strong-typing
rules.

Hope this helps,

                         -- Adam





  reply	other threads:[~2011-11-21 19:25 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-21 19:03 type access Parent'Class Yukicanis
2011-11-21 19:25 ` Adam Beneschan [this message]
2011-11-21 19:40   ` Yukicanis
2011-11-21 19:45     ` Robert A Duff
2011-11-21 19:46       ` Yukicanis
2011-11-21 23:45   ` Gene
2011-11-22  8:42     ` Dmitry A. Kazakov
2011-11-22 10:07       ` Georg Bauhaus
2011-11-22 13:27         ` Simon Wright
2011-11-22 16:13           ` Georg Bauhaus
2011-11-21 19:33 ` Robert A Duff
2011-11-21 19:44   ` Yukicanis
2011-11-24 10:33   ` Yannick Duchêne (Hibou57)
2011-11-24 11:18     ` Yukicanis
2011-11-21 21:09 ` Jeffrey Carter
replies disabled

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