something "weird" about polymorphism

funog funog at ifrance.com
Sun Nov 15 12:52:08 PST 2009


downs wrote:
> funog wrote:
>> The following code :
>>
>> ------------------
>> import std.stdio;
>> class A {
>>     void foo(A a) {
>>         writefln("A");
>>     }
>> }
>>
>> class B : A {
>>     void foo(B b) {
>>         writefln("B");
>>     }
>> }
>>
>> void main() {
>>     B b = new B;
>>     A a = b;
>>     assert(a is b);
>>     b.foo(b);
>>     a.foo(b);
>> }
>> --------------
>> outputs:
>> B
>> A
>>
>>
>> This is understandable as B.foo doesn't actually overrides A.foo. But
>> somehow it's weird to get different outputs while "a" and "b" are
>> basically the same object. Has anyone else encountered this problem in
>> real life? Will C+++, java act the same way?
>>
> 
> The behavior here is entirely correct and, in fact, could not happen any other way.
> 
> The only improvement would be disallowing declaring methods that shadow but don't override methods in the super class.
> 


This is the point, I think it should be disallowed (particularly in D, 
since shadowing declarations are deprecated). I understand that B.foo 
doesn't override A.foo, but I mean, you have the same object, the same 
function (name), the same parameter... and a different result.
Well, I'm not a pro so I don't know how error-prone it can be in "real 
life".


> The inheritance contract that B enters when it inherits from A states that its foo will take any object of type A. Remember: parameters generalize, results specialize. B's foo _cannot_ override A's foo because that would mean you could not use a B in all situations you could use an A, which breaks polymorphism completely.


More information about the Digitalmars-d-learn mailing list