"The last feature": overridable methods in interfaces

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Mon Feb 8 14:19:28 PST 2010


Steven Schveighoffer wrote:
> On Mon, 08 Feb 2010 16:09:19 -0500, Andrei Alexandrescu 
> <SeeWebsiteForEmail at erdani.org> wrote:
> 
>> Steven Schveighoffer wrote:
>>> On Mon, 08 Feb 2010 15:13:33 -0500, Andrei Alexandrescu 
>>> <SeeWebsiteForEmail at erdani.org> wrote:
>>>
>>>> Steven Schveighoffer wrote:
>>>>> On Mon, 08 Feb 2010 14:36:37 -0500, Andrei Alexandrescu 
>>>>> <SeeWebsiteForEmail at erdani.org> wrote:
>>>>>
>>>>>> Don wrote:
>>>>>>>  I don't understand this. How does belowTop() know how to call 
>>>>>>> top()?
>>>>>>
>>>>>> It calls top() through the normal interface mechanism. Inside 
>>>>>> belowTop(), this has Stack!T type.
>>>>>  Actually, I think Don has a point here.  A virtual function (even 
>>>>> on an interface) is always called with the 'this' pointer, not the 
>>>>> interface pointer.
>>>>
>>>> That is done via an adjustment of the reference. In the case of an 
>>>> interface method, no adjustment is necessary. Inside the method, 
>>>> "this" has the static type of the interface and the dynamic type 
>>>> whichever class implements the interface.
>>>   void foo(Stack!T st)
>>> {
>>>   auto x = st.belowTop();
>>> }
>>>  OK, so if st's virtual function for belowTop points to the default 
>>> implementation, there is no adjustment.  But what if the actual 
>>> object *did* override the default implementation?  Does it also 
>>> receive the interface pointer as 'this'?  Where does the adjustment 
>>> happen?  What happens if you have a reference to the actual concrete 
>>> object type?  Do you have to thunk to the correct interface to pass 
>>> in the expected interface pointer?  It can't be both ways.
>>
>> If an object overrode the default implementation, the pointer to 
>> method belowTop will point to code that does do the adjustment.
> 
> If I understand this correctly, calling such a "default implementation" 
> function is different than calling a standard interface function.  And 
> each entry in such an interface for a overridden method will point to a 
> "pre function" that adjusts the 'this' reference before jumping to the 
> real implementation.

Actually that's what's happening today.

> The vtable entries of the object itself would point to a function that 
> does not do the adjustment, correct?

Yes, but let's not forget that each object stores more than one vptrs.

> I think all the information is available to make this work, the only 
> issue I see is that a function with a default implementation 
> artificially changes the ABI for that function.  Adding a default 
> implementation therefore will make compiled objects incompatible, even 
> with the same vtable layout.

Not getting this, but I'll let Walter weigh in.


Andrei



More information about the Digitalmars-d mailing list