TITLE: Bad global object initialization schemes [ This material comes from "C++ Strategies and Tactics" by Robert B. Murry, p. 127 ] class Base { public: void foo (); }; class Derived : public Base { public: void foo (); }; main () { Derived d; d.foo (); // calls Derived::foo Base& b(d); b.foo (); // calls Base::foo } It is very bad practice for a program to deliberately exploit this behavior. The whole idea of inheritance is that the object, not the caller, knows the implementation of a particular operation. A program that depends on different implementations being chosen based on how the operation was called is using the type system to control part of the implementation of the program -- and in a very subtle way. [ Guide actually breaks this rule for one very restricted case - to provide a type specific access method. For example, TCommonGraph* TCommonNode::parentGraph (); TSESDesignGraph* TSESDesignNode::parentGraph (); Both implementations of these use the same logic, but "wrap up" the cast to the correct derived type. ]