"The last feature": overridable methods in interfaces
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Mon Feb 8 14:17:31 PST 2010
Don 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.
>>
>> -Steve
>
> I have a strong suspicion that it's exactly the same as multiple
> inheritance.
> I thought about this quite a bit a year ago, and initially I thought
> that having no data members made it OK. But it's deceptive.
> Virtual member functions are still a problem. I think you can only have
> final functions.
I think it's only data. The problem is that you end up storing multiple
copies of the same interface object inside the final object. As long as
the per-interface state is compiler-maintained and immutable, you should
be in good shape.
Andrei
More information about the Digitalmars-d
mailing list