Overloading/Inheritance issue

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


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



More information about the Digitalmars-d mailing list