Home Segments Index Top Previous Next

522: Mainline

So far, you have seen only instances of public derivation, marked by the symbol public.

If you change a derivation from public to protected, every public member variable or member function in the base class acts as though it were part of the protected part of the definition of the derived class.

Suppose, for example, that you define the box and box_car classes as follows, with a protected derivation of the box_car class from the box class:

class box {
  public: double height, width, length;
    // Default constructor:
    box ( ) { }
    // Argument-bearing constructor:
    box (double h, double w, double l) {
      height = h; width = w; length = l;
    }
    // Volume member function:
    double volume ( ) {return height * width * length;}
};
class box_car : public railroad_car, protected box {  
  public: 
    // Default constructor: 
    box_car ( ) : box (10.5, 9.5, 40.0) { } 
    // Displayers: 
    virtual void display_height ( ) {cout << height;} 
    virtual void display_short_name ( ) {cout << "box";} 
    virtual void display_capacity ( ) {cout << volume ( );} 
}; 

Because the derivation of box_car, relative to the box class, is a protected derivation, all public member variables and member functions defined in the box base class act as though they are protected member variables and member functions in the derived box_car class. Because they act as though they are protected, they are still accessible to member functions defined in the box_car class and to member functions defined in any subclasses that may be derived from the box_car class. For example, the display_height function defined in the box_car class can read from the height member variable.