Home Segments Index Top Previous Next

550: Mainline

Now recall that in ordinary_capacity_function, the parameter, r is a railroad_car parameter. Accordingly, the argument is copied into a chunk of memory suited to a railroad_car object.

Suppose, however, that the argument is actually a box_car object, identified by a dereferenced railroad-car pointer. Unfortunately, at compile time, the C++ compiler cannot anticipate that your program will hand such an argument to ordinary_capacity_function. Accordingly, only the railroad-car portion of the box_car object is copied:

Memory reserved for                      Memory reserved for r, 
box_car argument                         a railroad_car parameter 
 |                                        | 
 v                                        v 
*-----*               Copy               *-----* 
|     |          ------------->          |     | 
|-----|                                  |-----| 
|     |                                  |     | 
|-----|                                  *-----* 
|     | | 
|-----| | 
|     | | box_car-specific portion not copied 
|-----| |  
|     | | 
*-----*   

The net result is that only the chunk of memory that holds a railroad_car object is visible to the C++ mechanism that is supposed to figure out what version of the capacity virtual member function to use at run time. Because the railroad-car version of capacity returns 0.0, you end up with 0.0 filling an entire column of the report displayed by the analyze_train program.