Why can't structs be derived from?

Jens jne at somewhere.org
Tue Mar 15 12:07:12 PDT 2011


Andrei Alexandrescu wrote:
> On 03/15/2011 01:48 PM, Jens wrote:
>> Andrei Alexandrescu wrote:
>>> On 3/15/11 12:55 PM, Jens wrote:
>>>> Steven Schveighoffer wrote:
>>>>> That's all there is.  Structs do not have inheritance, only alias
>>>>> this.
>>>>
>>>> Why don't they though? Inheritance does not have to mean
>>>> polymorphic. It can mean composition, like in C++. I don't
>>>> understand the reason for such ugly syntax.
>>>
>>> Using inheritance for composition is frowned upon in C++ for good
>>> reasons. If you want composition, the best is to use composition.
>>
>> It was frowned upon early on because the compiler implementers didn't
>> have their acts together and the resulting objects layout could not
>> be relied upon.
>
> That's not the reason at all.
>
>> The example I gave came from the STL so I think "frowned
>> upon" is something you are picking up from long ago.
>
> STL's mild abuses of inheritance (in the absence of something better
> such as aliases) are known and understood without being condoned at
> large. For a good account of why composition is preferable to
> inheritance, you may want to refer to
> http://www.artima.com/cppsource/codestandards3.html and the referred
> bibliography.
>

Knowing where to break from "absolutisms" is important. There's nothing 
wrong with doing extension of structs via derivation.

>> Composition means access through the members rather than direct
>> access: struct point
>> {
>>      int x;
>>      int y;
>> };
>>
>> struct point3d
>> {
>>      point pt;
>>      int z;
>> };
>>
>> ...
>>
>> point3d mypoint;
>> mypoint.pt.x = 3; // ugly
>>
>>>
>>> The reason for the allegedly ugly syntax is that it's considerably
>>> more general.
>>
>> Over-generality is a key thing that gets languages in trouble.
>
> This is general enough to be too vacuous.

It is easily observable. Knowing where to draw the lines is key. In this 
instance, I think he blew it.

> We figured we need a better
> subtyping mechanism for structs and designed 'alias this' for that
> purpose. How is this getting D in trouble?

I won't use it.

>
>>> It is often the case that a struct defines an entity
>>> that is implicitly convertible to another entity - could be an
>>> rvalue vs. lvalue, a class vs. another struct vs. a primitive type,
>>> could need a run-time operation etc. Inheritance would offer at
>>> best few of these amenities, whereas 'alias this' offers all with a
>>> simple syntax.
>>
>> What's wrong with conversion operators? I wouldn't use "simple" and
>> "ugly" in the same sentence. I would have chosen a different design.
>
> Please give detail on the design you would have chosen, thanks.
>

I have no problem with a C++-like way. I think it needed not been 
drastically departed from. I have an object model planned but I'm not 
about to detail it here. Sometimes I wonder if D has the goal of changing 
as much as possible just for change sake. 




More information about the Digitalmars-d mailing list