distinguish between classes and structures

Weed resume755 at mail.ru
Mon Dec 15 19:26:18 PST 2008


Bill Baxter пишет:
> 2008/12/16 Weed <resume755 at mail.ru>:
>> Frits van Bommel пишет:
>>> Weed wrote:
>>>> In C++, we had the problem - "slicing" objects.
>>>> In D this problem is solved inability to inherit from structs.
>>>> Without inheritance of structs many things are not possible, compared
>>>> with C++.
>>>> Why, instead of the complete inability to inherit, just do not make
>>>> impossible to up casting struct type by value.
>>>>
>>>> like this:
>>>>
>>>> struct s1 {}
>>>> struct s2 : s1 {}
>>>>
>>>> s1 base;
>>>> s2 derr;
>>>>
>>>> s1* base_ptr = &derr; // ok
>>>> s1 val = derr; // error
>>> This is why:
>>>  s1 val2 = *base_ptr; // error
>> I do not understand that it is wrong?
> 
> The problem is that base_ptr isn't actually pointing to an s1.  So by
> dereferencing it and assigning to an s1 you just sliced it.

This break garbage collection? Or what?

>  Any extra
> data derr had is lost.  Any method overrides it had are lost.  So to
> avoid slicing you would need to disallow dereferencing struct
> pointers, or disallow pointing to a struct of a different type.
> 
> Disallowing dereferencing a struct pointer seems like it might be
> possible.  But then again that's also kinda what class gives you
> already.  And then you'd be left with no way to create a pointer that
> can be turned back into a value!  That doesn't sound so good.


More information about the Digitalmars-d-learn mailing list