D - Bug in polymorphic methods searching
- Mike Wynn (30/30) Aug 13 2003 compiler beta v0.69
-
Walter
(3/33)
Aug 13 2003
Yes. C++ works the same way
. - Mike Wynn (6/51) Aug 13 2003 I guess I must have run in to it b4, been doing Java and C# too much ...
- Mike Wynn (9/61) Aug 13 2003 I though I better check the D docs ....
- Fabian Giesen (3/7) Aug 14 2003 In general, you can. But this rule (the so-called hiding rule) prevents
compiler beta v0.69 the following will not compile. I have to add public void show( CA a, CB b ) { super.show( a, b ); } to C; and then also show( CA a ) { super.show( b ); } to B to allow show( new CA() ); to be usable. ---------------------------------- import c.stdio; class CA { } class CB : CA { } class A { public void show( CA a ) { printf("A::show( CA )\n"); } } class B : A { public void show( CA a, CB b ) { printf("B::show(CA, CB)\n"); } } class C : B { public void show( CA a ) { printf("C::show( CA )\n"); } } class D : C { } int main( char[][] args ) { D b = new D(); b.show( new CA(), new CB() ); return 0; } // test_015.d(25): function show (CA a) does not match argument types (CA ,CB ) -----------
Aug 13 2003
Yes. C++ works the same way <g>. "Mike Wynn" <mike.wynn l8night.co.uk> wrote in message news:bhed4u$1dre$1 digitaldaemon.com...compiler beta v0.69 the following will not compile. I have to add public void show( CA a, CB b ) { super.show( a, b ); } to C; and then also show( CA a ) { super.show( b ); } to B to allow show( new CA() ); to be usable. ---------------------------------- import c.stdio; class CA { } class CB : CA { } class A { public void show( CA a ) { printf("A::show( CA )\n"); } } class B : A { public void show( CA a, CB b ) { printf("B::show(CA, CB)\n"); } } class C : B { public void show( CA a ) { printf("C::show( CA )\n"); } } class D : C { } int main( char[][] args ) { D b = new D(); b.show( new CA(), new CB() ); return 0; } // test_015.d(25): function show (CA a) does not match argument types (CA ,CB ) -----------
Aug 13 2003
"Walter" <walter digitalmars.com> wrote in message news:bhenv4$1o2f$1 digitaldaemon.com...Yes. C++ works the same way <g>.both of them "get it right" apart from "C++ does it that way" is there a good reason why D goes ?"Mike Wynn" <mike.wynn l8night.co.uk> wrote in message news:bhed4u$1dre$1 digitaldaemon.com...(CAcompiler beta v0.69 the following will not compile. I have to add public void show( CA a, CB b ) { super.show( a, b ); } to C; and then also show( CA a ) { super.show( b ); } to B to allow show( new CA() ); to be usable. ---------------------------------- import c.stdio; class CA { } class CB : CA { } class A { public void show( CA a ) { printf("A::show( CA )\n"); } } class B : A { public void show( CA a, CB b ) { printf("B::show(CA, CB)\n"); } } class C : B { public void show( CA a ) { printf("C::show( CA )\n"); } } class D : C { } int main( char[][] args ) { D b = new D(); b.show( new CA(), new CB() ); return 0; } // test_015.d(25): function show (CA a) does not match argument types,CB ) -----------
Aug 13 2003
I though I better check the D docs .... In D, function overloading is simple. It matches exactly, it matches with implicit conversions, or it does not match. If there is more than one match, it is an error. this example has one exact match without even implicit conversion, it seems to me that c++ is broken (what's the point of allowing overloading and virtual function overridding if you can't actually use it!) "Mike Wynn" <mike.wynn l8night.co.uk> wrote in message news:bhepm4$1pk4$1 digitaldaemon.com..."Walter" <walter digitalmars.com> wrote in message news:bhenv4$1o2f$1 digitaldaemon.com...Yes. C++ works the same way <g>.both of them "get it right" apart from "C++ does it that way" is there a good reason why D goes ?"Mike Wynn" <mike.wynn l8night.co.uk> wrote in message news:bhed4u$1dre$1 digitaldaemon.com...(CAcompiler beta v0.69 the following will not compile. I have to add public void show( CA a, CB b ) { super.show( a, b ); } to C; and then also show( CA a ) { super.show( b ); } to B to allow show( new CA() ); to be usable. ---------------------------------- import c.stdio; class CA { } class CB : CA { } class A { public void show( CA a ) { printf("A::show( CA )\n"); } } class B : A { public void show( CA a, CB b ) { printf("B::show(CA, CB)\n"); } } class C : B { public void show( CA a ) { printf("C::show( CA )\n"); } } class D : C { } int main( char[][] args ) { D b = new D(); b.show( new CA(), new CB() ); return 0; } // test_015.d(25): function show (CA a) does not match argument types,CB ) -----------
Aug 13 2003
this example has one exact match without even implicit conversion, it seems to me that c++ is broken (what's the point of allowing overloading and virtual function overridding if you can't actually use it!)In general, you can. But this rule (the so-called hiding rule) prevents some types of ambiguities to happen during name lookup/overload resolution. -fg
Aug 14 2003
"Fabian Giesen" <rygNO SPAMgmx.net> wrote in message news:bhh5jg$149q$1 digitaldaemon.com...resolution. was this rule introduced with namespace ? (been doing mainly Java and C for the last few years, last time I programmed in C++ (apart for the odd bit of using MFC/WTL) was with Borland C++3.5 for DOS (and I'm sure that worked as expected [then again I'm sure that allowed ++i &= 7; !!]) found a solution with gcc (the `using` clause) allow importing of the super classes method signatures. class CA { }; class CB : public CA { }; class A { public: virtual void show( CA * a ) { printf("A::show( CA )\n"); } }; class B : public A { public: virtual void show( CA * a, CB * b ) { printf("B::show(CA, CB)\n"); } }; class C : public B { public: using B::show; virtual void show( CA * a ) { printf("C::show( CA )\n"); } }; class D : public C { }; int main( int argc, char * argv[] ) { D * d = new D(); d->show( new CA(), new CB() ); return 0; }this example has one exact match without even implicit conversion, it seems to me that c++ is broken (what's the point of allowing overloading and virtual function overridding if you can't actually use it!)In general, you can. But this rule (the so-called hiding rule) prevents some types of ambiguities to happen during name lookup/overload
Aug 14 2003
You're right. I'll look into making this work better.
Aug 15 2003