struct inheritance
kris
foo at bar.com
Fri Aug 31 02:09:06 PDT 2007
Regan Heath wrote:
> kris wrote:
>> Bill Baxter wrote:
>>> Robert Fraser wrote:
>>>> Bill Baxter Wrote:
>>>>
>>>>> Let us all turn our copies of WalterAndrei.pdf to page 40 where yea
>>>>> verily it doth say:
>>>>>
>>>>> struct M { int a; }
>>>>> struct S {
>>>>> M m;
>>>>> alias m this;
>>>>> int b;
>>>>> }
>>>>>
>>>>> Why not just allow mixin to do this?
>>>>>
>>>>> struct M { int a; }
>>>>> struct S {
>>>>> mixin M;
>>>>> int b;
>>>>> }
>>>>>
>>>>> That's basically the way it's done now except now it would be more
>>>>> like:
>>>>> template MMixin() { int a; }
>>>>> struct M { mixin M; }
>>>>> struct S { mixin M; int b; }
>>>>>
>>>>> Just let us treat a struct like a zero arg template for mixin
>>>>> purposes.
>>>>>
>>>>> --bb
>>>>
>>>> It amounts to the same thing, so it just depends on which syntax you
>>>> prefer. Personally, I like...
>>>>
>>>> struct S : M { int b; }
>>>>
>>>> ... meaning S is non-polymorphically inherited from M. I guess the
>>>> argument against taht syntax was that it would be confusing for
>>>> people from a C++ background who assume polymorphic inheritance for
>>>> structs.
>>>>
>>>> Anyways, it's up to Walter to decide on the syntax, and he says
>>>> "alias this".
>>>
>>> I did just think of one issue which is that constructors/opCalls for
>>> M would be weird. S needs to decide how to initialize the M part,
>>> which would be difficult if M's constructors are just mixed in directly.
>>>
>>> I guess from a compiler-writers perspective "alias this" is more like
>>> what actually happens when you inherit in typical C++ fashion. In
>>> that case I guess I'd prefer 'import'
>>>
>>> struct M { int a; }
>>> struct S {
>>> import M;
>>> int b;
>>> }
>>>
>>> then you can specify when you need to access the M parts just like
>>> you do in C++ by M.member.
>>>
>>> I'd even prefer "alias m .;" to "alias m this;". It just seems wrong
>>> and goes against the nice happy view that 'this' is just an
>>> implicitly defined pointer member.
>>>
>>> --bb
>>
>> Perhaps a bigger problem is this:
>>
>> # struct M { int a; }
>> # struct S {
>> # int b;
>> # import M;
>> # }
>>
>> Now, S is no longer derived from M. Hence, it would seem the right way
>> to do this is to take it out of the hands of the developer and do
>> something akin to
>>
>> # struct S : M
>>
>> as had been suggested previously. Sure, that particular syntax may
>> mean something else to some C++ folks, but at least the intent is
>> clear and the /outcome/ is consistent.
>
> When you say "derived from M" are you referring to the ordering/layout
> of M matching that of the start of S (new fields of S therefore existing
> in the part of S which is larger than M).
>
> I'm not sure "derived" is the right term to use, we don't want to
> confuse it with class derivation, perhaps saying "S is based on M" is
> better? /You say potatoes I say ../
>
> As one of the main reasons/uses for structs is to define a specific
> layout in memory, perhaps the main reason for Walters syntax is to make
> it possible to define that layout however required.
>
> I think there are cases where they should match, and you should be able
> to cast from S to M (albeit with slicing and woe to the developer who
> tries to cast an array of S to M - but perhaps the cast operator can
> handle this case?). In this case S is based on M.
>
> I think there are also cases where you need to specify a different
> layout and in this case S would not be based on M.
>
> Regan
Briefy:
ok, S /extends/ M :)
The ordering becomes an issue when you have a pointer to S, and wish to
use it as a pointer to an M. That's why, in C, the super-struct is
manually inserted as the first struct member. If you manually insert the
super-struct as the second or third member then, obviously, your pointer
is not convertible
More information about the Digitalmars-d
mailing list