brione@hpfcmdd.hp.com (Brion Emde) (03/26/91)
Hello fellow C++'ers, This is an example program that illustrates a problem I have been seeing with passing derived class pointers both by reference and by explicit pointer-to-pointer arguments to a function defined to take a pointer to base class (the push calls in main). The complilers I tried this on both complain. I am confused by the messages from the compilers. I thought that derived class pointers are implicitly converted to base class pointers whenever required. But the ATT-based compiler complains about passing the pointer by reference, and allocates a temporary variable for the reference, so that my pointer is not updated. Also the ATT compiler complains that it can't find the proper function to call for the explicit pointer-to-pointer version of the call (see below), the same complaint generated by the g++ compiler. Am I totally off base here, or should this example work? I submit it to the C++ community for the definitive answer. Thank you in advance, Brion Emde Hewlett-Packard Mechanical Design Division MS 110 3404 E. Harmony Road Ft. Collins, CO 80525 work phone - (303) 229-4838 ------------------------CUT HERE------------------------------------------- // Stack example with two alternate next pointer passing // // It seems to me that the implicit conversion from derived class pointer to // base class pointer is not occuring correctly in the push() calls in main(). // // Messages from HP C++ B2400 X.02.18/ATT 2.1 C++ compiler // // CC: "ref_ptr_prob.C", line 55: warning: temporary used to initialize // reference; no changes will be propagated to actual argument (145) // CC: "ref_ptr_prob.C", line 56: error: bad argument list for // STACK_NODE::push() (no match against any STACK_NODE::push()) (1261) // // Messages from GNU g++: // // ref_ptr_prob.C: In function int main (): // ref_ptr_prob.C:56: bad argument 0 for function // `STACK_NODE::push (class STACK_NODE **)' (type was class INT_STACK_NODE **) // class STACK_NODE { private: STACK_NODE *next_ptr; public: STACK_NODE() : next_ptr(0) {} virtual ~STACK_NODE() {} void push(STACK_NODE* &); // pass pointer by reference void push(STACK_NODE* *); // pass pointer to pointer }; void STACK_NODE::push(STACK_NODE* &stack) { next_ptr = stack; stack = this; } void STACK_NODE::push(STACK_NODE* *stackp) { next_ptr = *stackp; *stackp = this; } // USELESS derived class for example class MY_STACK_NODE : public STACK_NODE { }; main() { MY_STACK_NODE *stack = 0; MY_STACK_NODE *stn1 = new MY_STACK_NODE; MY_STACK_NODE *stn2 = new MY_STACK_NODE; stn1->push(stack); stn2->push(&stack); }