TITLE: Derivation is not overloading PROBLEM: Consider the following code fragment: class Base { public: Base() { cout << "Base::Base()\n"; } Base(char *) { cout << "Base::Base(char *)\n"; } void func(char*) { cout << "Base::func(char *)\n"; } }; class Derived:public Base { public: Derived() { cout << "Derived::Derived()\n"; } void func(const Base&){ cout << "Derived::func(const Base&)\n"; } }; main() { Derived *d = new Derived(); d->func("hello"); } What should it output? Cfront 2.1 (<>) gives: Base::Base() Derived::Derived() Base::Base(char *) Derived::func(const Base&) g++ (version 1.39.0 beta (based on GCC 1.39)) gives: Base::Base() Derived::Derived() Base::func(char *) RESPONSE: Gary Randolph (???) Cfront has the correct behavior. What you have here is one of the most common mistakes I have seen people make. DERIVATION IS *NOT* OVERLOADING. See page 310 of the ARM. The name of the function "func" exists in two DIFFERENT scopes. The derived class essentially hides Base::func. But I PUBLICly derive you say? True, that is why the following is legal: d->Base::func(char *); private derivation would make this statement illegal.