Overloaded function disappears on polymorphism
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Jan 24 14:31:30 PST 2015
On 01/24/2015 10:55 AM, tcak wrote:
> main.d
> ===================================================
> class Car{
> public void makeBeep( char c ){}
> public void makeBeep( string s ){}
> }
>
> class Tesla: Car{
> override public void makeBeep( char c ){
> writeln("C = ", c);
> }
> }
>
> void main(){
> auto t = new Tesla();
>
> t.makeBeep("Model S");
> }
> ===================================================
>
> Error: function main.Tesla.makeBeep (char c) is not callable using
> argument types (string)
>
> For Tesla, I expected that makeBeep( string s ) would still be defined.
> Because I have overridden on makeBeep( char c ). Isn't that correct?
This is called "name hiding" and works the same at least in C++. The
purpose is to avoiding function hijacking. Imagine the following
scenario where a 'short' argument is dispatched to a function taking 'int':
class Base
{
void foo(int)
{}
}
class Derived : Base
{
override void foo(int)
{}
}
void main()
{
// Compiles: 'short' is converted to 'int':
(new Derived).foo(short.init);
}
Without name hiding, the following addition to Base (which, presumably
the author of Derived has no control over) would cause the call to
bypass Derived.foo(short) and go to Base.foo(short):
class Base
{
void foo(int)
{}
void foo(short) // <-- New function
{}
}
class Derived : Base
{
override void foo(int)
{}
}
void main()
{
/* Compilation ERROR:
*
* Deprecation: class deneme.Derived use of deneme.Base.foo(short
* _param_0) hidden by Derived is deprecated; use 'alias foo =
Base.foo;'
* to introduce base class overload set
*/
(new Derived).foo(short.init);
}
Ali
More information about the Digitalmars-d-learn
mailing list