Overloading/Inheritance issue

Chris Nicholson-Sauls ibisbasenji at gmail.com
Wed Aug 1 14:34:58 PDT 2007


Kirk McDonald wrote:
> Chris Nicholson-Sauls wrote:
>> Steve Schveighoffer wrote:
>>
>>> Hi,
>>>
>>> I am wondering if the following behavior is intentional and if so, 
>>> why.  Given the code below:
>>>
>>> class X
>>> {
>>>   public int foo()
>>>   {
>>>     return foo(0);
>>>   }
>>>
>>>   public int foo(int y)
>>>   {
>>>     return 2;
>>>   }
>>> }
>>>
>>> class Y : X
>>> {
>>>   public int foo(int y)
>>>   {
>>>     return 3;
>>>   }
>>> }
>>>
>>> int main(char [][] argv)
>>> {
>>>   Y y = new Y;
>>>   y.foo(); //does not compile, says that the argument type doesn't match
>>>   y.foo(1);
>>>   X x = y;
>>>   x.foo();
>>>   return 0;
>>> }
>>>
>>>
>>> How come the marked line above does not compile?  Clearly there is no 
>>> ambiguity that I want to call the base's foo, which in turn should 
>>> call Y's foo(int) with an argument of 0.  It's not that the method is 
>>> not accessible, because I can clearly access it by casting to an X 
>>> type (as I have done in the subsequent lines).
>>>
>>> If you interpret the code, I'm defining a default behavior for foo() 
>>> with no arguments.  A derived class which wants to keep the default 
>>> behavior of foo() as calling foo(0), should only need to override 
>>> foo(int).  However, the compiler does not allow this.  Why?  Is there 
>>> a workaround (besides implementing a stub function which calls 
>>> super.foo())?  Maybe there is a different method of defining in a 
>>> base class one version of a function in terms of another?
>>>
>>> -Steve
>>
>>
>> I've never really 100% understood why this is the way that it is, but 
>> there /does/ exist a simple workaround.  Add this line to Y:
>>   alias super.foo foo;
>>
>> Yep, alias the superclass's method into the current class's scope.  
>> The problem has something to do with the lookup rules.  At the very 
>> least, I would think that declaring Y.foo with the 'override' 
>> attribute might give the wanted behavior, since surely a int(int) 
>> couldn't override a int(), yes?  But no, last I checked, it doesn't 
>> work either.
>>
>> -- Chris Nicholson-Sauls
> 
> That's not a workaround, nor is this considered a problem. This is the 
> intended behavior.
> 

Intended, yes.  Wanted?  Not by all.  (Which is why it keeps coming up 
again, and again, and again... ad nauseum.)  I haven't personally 
scanned the specs to see if its at least now explicitly shown as the way 
to do this; if it isn't, it should be.

-- Chris Nicholson-Sauls



More information about the Digitalmars-d mailing list