Hi, I think CINT doesn't always find the right function to call. It is possible that what I am doing is a C++ error (or at least undefined behavior), but I didn't think so... Test code follows: #include <iostream.h> class Base { public: int foo; }; class Derived: public Base { public: int bar; }; class Derived2: public Derived { public: int baz; }; int func(Base *x) { return x->foo; } int func(Derived *x) { return x->bar; } /* int main() { Derived2 blah; blah.baz = 1; blah.bar = 2; blah.foo = 3; Derived *blahp = &blah; Base *blahp2 = &blah; cout << "Direct: " << func(&blah) << endl; cout << "Derived *: " << func(blahp) << endl; cout << "Base *: " << func(blahp2) << endl; } */ If this code is loaded into root and the commented out main() executed from the command line, I get: root [7] cout << "Direct: " << func(&blah) << endl; Direct: 3 root [9] cout << "Derived *: " << func(blahp) << endl; Derived *: 2 root [10] cout << "Derived *: " << func(blahp2) << endl; Derived *: 3 whereas if I compile the code with egcs and run the a.out, I get: Direct: 2 Derived *: 2 Base *: 3 I would guess that the problem is that in searching for something matching func(Derived2 *) it finds first in its list func(Base *), which matches, and doesn't bother looking for a more derived match of the function. >From a strict reading of Stroustrup (3rd ed, pp. 149 - 150), it would seem that the first call should actually be regarded as ambiguous, but neither egcs nor root reported either an error or warning, and egcs's behavior is much more intuitive. I couldn't find a clearer statement of the official standard anywhere, unfortunately. George Heintzelman georgeh@aya.yale.edu
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:39 MET