SlideShare a Scribd company logo
1 of 17
Download to read offline
Douglas C. Schmidt                                     OO Programming with C++

                                                                                                                        Background
                                                                                             Object-oriented programming is often defined as the combination of
                                                                                             Abstract Data Types (ADTs) with Inheritance & Dynamic Binding
         Single & Multiple Inheritance in C++
                                                                                             Each concept addresses a different aspect of system
                                                                                             decomposition:
                           Douglas C. Schmidt
                                                                                            1. ADTs decompose systems into two-dimensional grids of modules
       Professor                                       Department of EECS                      – Each module has public & private interfaces
       d.schmidt@vanderbilt.edu                        Vanderbilt University                2. Inheritance decomposes systems into three-dimensional
       www.dre.vanderbilt.edu/schmidt/                (615) 343-8197                          hierarchies of modules
                                                                                               – Inheritance relationships form a lattice
                                                                                            3. Dynamic binding enhances inheritance
                                                                                               – e.g., defer implementation decisions until late in the design
                                                                                                 phase or even until run-time!


                                                                                          Copyright c 1997-2006          Vanderbilt University                        1




Douglas C. Schmidt                                              OO Programming with C++   Douglas C. Schmidt                                     OO Programming with C++

                     Data Abstraction vs. Inheritance                                                             Motivation for Inheritance
                                                                                             Inheritance allows you to write code to handle certain cases 
                              DATA ABSTRACTION
                              DATA ABSTRACTION
                                 (2 DIMENTIONAL)
                                 (2 DIMENTIONAL)
                                                                                             allows other developers to write code that handles more specialized
                                                                                             cases, while your code continues to work
                                                                                             Inheritance partitions a system architecture into semi-disjoint
                                                                                             components that are related hierarchically
                                                                                             Therefore, we may be able to modify and/or reuse sections of the
                                                                                             inheritance hierarchy without disturbing existing code, e.g.,
                                                                                             – Change sibling subtree interfaces
                                                                                                i.e., a consequence of inheritance
                                                                                             – Change implementation of ancestors
                                  INHERITANCE                                                   i.e., a consequence of data abstraction
                                   (3 DIMENTIONAL)




Copyright c 1997-2006          Vanderbilt University                                 2    Copyright c 1997-2006          Vanderbilt University                        3
Douglas C. Schmidt                                      OO Programming with C++   Douglas C. Schmidt                                                 OO Programming with C++

                        Inheritance Overview                                                                 Visualizing Inheritance
   A type (called a subclass or derived type) can inherit the
   characteristics of another type(s) (called a superclass or base type)
   – The term subclass is equivalent to derived type                                                                   Base
                                                                                                                                                   Derived
   A derived type acts just like the base type, except for an explicit list                                                                           2
   of:                                                                                                     Derived
                                                                                                              1
  1. Specializations                                                                                                                 Derived
     – Change implementations without changing the base class                                                                           5
       interface
     – Most useful when combined with dynamic binding                                                                Derived
                                                                                                 Derived                4
  2. Generalizations/Extensions                                                                     3                                              Derived
     – Add new operations or data to derived classes                                                                                                  6



Copyright c 1997-2006         Vanderbilt University                           4   Copyright c 1997-2006              Vanderbilt University                                5




Douglas C. Schmidt                                      OO Programming with C++   Douglas C. Schmidt                                                 OO Programming with C++

                        Types of Inheritance                                                   Inheritance Trees vs. Inheritance DAGs
   Inheritance comes in two forms, depending on number of parents a
   subclass has
                                                                                                                         Base
                                                                                                          Derived                        Derived
  1. Single Inheritance (SI)                                                                                 1                              2
     – Only one parent per derived class
     – Form an inheritance tree                                                                                      INHERITANCE             Derived
     – SI requires a small amount of run-time overhead when used                                          Derived        TREE                   4
                                                                                                             3
       with dynamic binding
     – e.g., Smalltalk, Simula, Object Pascal
  2. Multiple Inheritance (MI)                                                                             Base                               Base
     – More than one parent per derived class                                                               1             Derived              2
                                                                                                                             1
     – Forms an inheritance Directed Acyclic Graph (DAG)
     – Compared with SI, MI adds additional run-time overhead (also
                                                                                                                      INHERITANCE
       involving dynamic binding)                                                                          Derived                           Derived
                                                                                                              3           DAG                   4
     – e.g., C++, Eiffel, Flavors (a LISP dialect)

Copyright c 1997-2006         Vanderbilt University                           6   Copyright c 1997-2006              Vanderbilt University                                7
Douglas C. Schmidt                                   OO Programming with C++   Douglas C. Schmidt                                     OO Programming with C++

                        Inheritance Benefits                                                            Inheritance Liabilities
1. Increase reuse  software quality
                                                                               1. May create deep and/or wide hierarchies that are hard to understand
      Programmers reuse the base classes instead of writing new                    navigate without class browser tools
      classes
      – Integrates black-box  white-box reuse by allowing extensibility       2. May decrease performance slightly
        and modification without changing existing code                               i.e., when combined with multiple inheritance  dynamic binding
      Using well-tested base classes helps reduce bugs in applications
      that use them                                                            3. Without dynamic binding, inheritance has limited utility, i.e., can only
      Reduce object code size                                                     be used for implementation inheritance
2. Enhance extensibility  comprehensibility
                                                                                      dynamic binding is essentially pointless without inheritance
      Helps support more flexible  extensible architectures (along with
      dynamic binding)                                                         4. Brittle hierarchies, which may impose dependencies upon ancestor
                                                                                  names
      – i.e., supports the open/closed principle
      Often useful for modeling  classifying hierarchically-related
      domains

Copyright c 1997-2006        Vanderbilt University                        8    Copyright c 1997-2006         Vanderbilt University                         9




Douglas C. Schmidt                                   OO Programming with C++   Douglas C. Schmidt                                     OO Programming with C++

                         Inheritance in C++                                                     Key Properties of C++ Inheritance
                                                                                  The base/derived class relationship is explicitly recognized in C++
   Deriving a class involves an extension to the C++ class declaration            by predefined standard conversions
   syntax
                                                                                  – i.e., a pointer to a derived class may always be assigned to a
   The class head is modified to allow a derivation list consisting of               pointer to a base class that was inherited publicly
   base classes, e.g.,                                                               But not vice versa . . .
                                                                                  When combined with dynamic binding, this special relationship
   class Foo { /* . . . */ };
                                                                                  between inherited class types promotes a type-secure, polymorphic
   class Bar : public Foo { /* . . . */ };
                                                                                  style of programming
   class Baz : public Foo, public Bar { /* . . . */ };
                                                                                  – i.e., the programmer need not know the actual type of a class at
                                                                                    compile-time
                                                                                  – Note, C++ is not arbitrarily polymorphic
                                                                                     i.e., operations are not applicable to objects that don’t contain
                                                                                       definitions of these operations at some point in their inheritance
                                                                                       hierarchy

Copyright c 1997-2006        Vanderbilt University                       10    Copyright c 1997-2006         Vanderbilt University                        11
Douglas C. Schmidt                                      OO Programming with C++   Douglas C. Schmidt                                               OO Programming with C++

                           Simple Screen Class                                                            Subclassing from Screen
class Screen {                           /* Base class. */
public:                                                                              class Screen can be a public base class of class Window, e.g.,
   Screen (int = 8, int = 40, char = ’ ’);                                           class Window : public Screen {
   ˜Screen (void);                                                                   public:
   short height (void) const { return this-height_; }                                 Window (const Point , int rows = 24,
   short width (void) const { return this-width_; }                                     int columns = 80, char default_char = ’ ’);
   void height (short h) { this-height_ = h; }                                        void set_foreground_color (Color );
   void width (short w) { this-width_ = w; }                                          void set_background_color (Color );
   Screen forward (void);                                                             void resize (int height, int width);
   Screen up (void);     Screen down (void);                                         // . . .
   Screen home (void); Screen bottom (void);                                       private:
   Screen display (void); Screen copy (const Screen );                              Point center_;
private:
                                                                                       Color foreground_;
   short height_, width_;
                                                                                       Color background_;
   char *screen_, *cur_pos_;
                                                                                     };
};

Copyright c 1997-2006           Vanderbilt University                        12   Copyright c 1997-2006            Vanderbilt University                               13




Douglas C. Schmidt                                      OO Programming with C++   Douglas C. Schmidt                                               OO Programming with C++

                        Multiple Levels of Derivation                                                  The Screen Inheritance Hierarchy
   A derived class can itself form the basis for further derivation, e.g.,
   ls0.9
   class Menu : public Window {                                                                                              Point
   public:
     void set_label (const char *l);                                                                      Screen
     Menu (const Point , int rows = 24,                                                                                                   Color
       int columns = 80,
       char default_char = ’ ’);
     // . . .
   private:                                                                                                  Window
     char *label_;                                                                                                                         Menu
   };
   class Menu inherits data  methods from both Window 
   Screen, i.e.,
   sizeof (Menu) = sizeof (Window) = sizeof (Screen)                                                     Screen/Window/Menu hierarchy

Copyright c 1997-2006           Vanderbilt University                        14   Copyright c 1997-2006            Vanderbilt University                               15
Douglas C. Schmidt                                                OO Programming with C++   Douglas C. Schmidt                                     OO Programming with C++

                        Variations on a Screen . . .                                                                Using the Screen Hierarchy
                                                                                            class Screen {
                           ps1 :                                                               public: virtual void dump (ostream ); };
                                                        ps2 :
                          Screen                                                            class Window : public Screen {
                                                       Screen
                                                                                               public: virtual void dump (ostream );
                                                                                            };
                                                                                            class Menu : public Window {
                           w:                                                                  public: virtual void dump (ostream );
                         Window                            Menu                             };
                                                                                            // stand-alone function
                                                                                            void dump_image (Screen *s, ostream o) {
                                                                                               // Some processing omitted
   A pointer to a derived class can be assigned to a pointer to any of its                     s-dump (o);
   public base classes without requiring an explicit cast:                                     // translates to: (*s-vptr[1]) (s, o));
   Menu m; Window w = m; Screen *ps1 = w;                                                 }
   Screen *ps2 = m;

Copyright c 1997-2006              Vanderbilt University                              16    Copyright c 1997-2006          Vanderbilt University                       17




Douglas C. Schmidt                                                OO Programming with C++   Douglas C. Schmidt                                     OO Programming with C++

                Using the Screen Hierarchy, (cont’d)                                                        Using Inheritance for Specialization
Screen s; Window w; Menu m;
                                                                                               A derived class specializes a base class by adding new, more
Bit_Vector bv;
                                                                                               specific state variables  methods
// OK: Window is a kind of Screen                                                              – Method use the same interface, even though they are
dump_image (w, cout);                                                                           implemented differently
// OK: Menu is a kind of Screen                                                                   i.e., “overridden”
dump_image (m, cout);                                                                         – Note, there is an important distinction between overriding, hiding,
// OK: argument types match exactly                                                               overloading . . .
dump_image (s, cout);
// Error: Bit_Vector is not a kind of Screen!                                                  A variant of this is used in the Template Method pattern
dump_image (bv, cout);                                                                        – i.e., behavior of the base class relies on functionality supplied by
                                                                                                 the derived class
                                                                                               – This is directly supported in C++ via abstract base classes  pure
                                                                                                 virtual functions


Copyright c 1997-2006              Vanderbilt University                              18    Copyright c 1997-2006          Vanderbilt University                       19
Douglas C. Schmidt                                     OO Programming with C++   Douglas C. Schmidt                                       OO Programming with C++

                         Specialization Example                                                       Specialization Example, (cont’d)
   Inheritance may be used to obtain the features of one data type in
   another closely related data type                                                Class Birthday derives from Date, adding a name field, e.g.,
   For example, we can create a class Date that represents an                       #include string
   arbitrary date:
                                                                                    class Birthday : public Date {
   class Date {                                                                     public:
   public:                                                                            Birthday (const std::string n, int m, int d, int y)
     Date (int m, int d, int y);                                                        : Date (m, d, y),
     virtual void print (ostream s) const {                                              person_ (n) { }
       s  month_  day_  year_  std::endl;                                     virtual void print (ostream s) const;
     }                                                                                // . . .
     // . . .                                                                       private:
   private:                                                                           std::string person_;
     int month_, day_, year_;                                                       };
   };

Copyright c 1997-2006          Vanderbilt University                       20    Copyright c 1997-2006            Vanderbilt University                       21




Douglas C. Schmidt                                     OO Programming with C++   Douglas C. Schmidt                                       OO Programming with C++

                        Implementation  Use-case                                                        Alternatives to Specialization
  Birthday::print() could print the person’s name as well as the
  date, e.g.,                                                                       Note that we could also use object composition (containment)
void Birthday::print (ostream s) const {                                           instead of inheritance for this example, e.g.,
  s  this-person_   was born on ;
  Date::print (s); s  std::endl;                                               class Birthday {
}                                                                                public:
                                                                                    Birthday (const std::string n, int m, int d, int y):
const Date july_4th (7, 4, 1993);                                                     date_ (m, d, y), person_ (n) {}
july_4th.print (cout); // july 4, 1993                                              // same as before
Birthday igors_birthday (Igor Stravinsky, 6, 17, 1882);                        private:
igors_birthday.print (cout);                                                        Date date_;
// Igor Stravinsky was born on june 17, 1882                                        std::string person_;
                                                                                 };
Date *dp = igors_birthday;
dp-print (cout); // what gets printed ?!?!
// (*dp-vptr[1])(dp, cout);

Copyright c 1997-2006          Vanderbilt University                       22    Copyright c 1997-2006            Vanderbilt University                       23
Douglas C. Schmidt                                                        OO Programming with C++   Douglas C. Schmidt                                      OO Programming with C++

               Alternatives to Specialization, (cont’d)                                                                     Another View of Inheritance
   However, in this case we would not be able to utilize the dynamic                                   Inheritance can also be viewed as a way to construct a hierarchy of
   binding facilities for base classes  derived classes, e.g.,                                        types that are “incomplete” except for the leaves of the hierarchy
   Date *dp = igors_birthday;                                                                         – e.g., you may wish to represent animals with an inheritance
   // ERROR, Birthday is not a subclass of date!                                                         hierarchy. Lets call the root class of this hierarchy “Animal”
                                                                                                       – Two classes derive from Animal: Vertebrate and Invertebrate
   While this does not necessarily affect reusability, it does affect
                                                                                                       – Vertebrate can be derived to Mammal, Reptile, Bird, Fish, etc..
   extensibility . . .
                                                                                                       – Mammals can be derived into Rodents, Primates, Pachyderms,
                                                                                                         etc..
                                                                                                       – Primates can be derived into Apes, Sloths, Humans, etc..
                                                                                                       – Humans can be derived into Males  Females
                                                                                                          We can then declare objects to represent specific males 
                                                                                                           females, e.g., Bob, Ted, Carol,  Alice



Copyright c 1997-2006                     Vanderbilt University                               24    Copyright c 1997-2006           Vanderbilt University                       25




Douglas C. Schmidt                                                        OO Programming with C++   Douglas C. Schmidt                                      OO Programming with C++

                         Another View of Inheritance                                                      Using Inheritance for Extension/Generalization

                                Animal
                                                                                                       Derived classes add state variables and/or operations to the
                                                                       Advantages                      properties and operations associated with the base class
                Vertebrate                       Invertebrate
                                                                       – Share code                   – Note, the interface is generally widened!
                                                                         set-up dynamic                – Data member  method access privileges may also be modified
     Reptile         Mammal              Bird                   Fish
                                                                         binding
                                                                                                       Extension/generalization is often used to faciliate reuse of
    Rodents          Primates                    Pachyderms
                                                                       – Model  classify              implementations, rather than interface
                                                                         external objects
     Apes            Humans                        Sloths                                              – However, it is not always necessary or correct to export interfaces
                                                                         with design 
                                                                                                         from a base class to derived classes
                      Males          Females                             implementation
                        Bob              Carol

                        Ted              Alice




Copyright c 1997-2006                     Vanderbilt University                               26    Copyright c 1997-2006           Vanderbilt University                       27
OO Progr
Douglas C. Schmidt                                 OO Programming with C++




                                                                                                                                      Often, a better approach in this case is to use a
                                                                                                  Extension/Generalization Example,
                 Extension/Generalization Example




                                                                                                                                                                                            RELATIONSHIP
                                                                                                                                                                                            DESCENDANT




                                                                                                                                                                                                                                Vector
   Using class Vector as a private base class for derived class




                                                                                                                                                                                                                                 Ada




                                                                                                                                                                                                                                                          Vanderbilt University
   Stack:




                                                                                                                                                                                                                      Checked
   – class Stack : private Vector { /* . . . */ };




                                                                                                                                                                                                                       Vector
                                                                                                                                      descendant/Is-A relationship . . .
                                                                                                                                      composition/Has-A rather than a




                                                                                                                                                                                                     Vector
   In this case, Vector’s operator[] may be reused as an




                                                                                                              (cont’d)
   implementation for the Stack push  pop methods
   – Note that using private inheritance ensures that operator[]




                                                                                                                                                                                            RELATIONSHIP
     does not appear in class Stack’s interface!




                                                                                                                                                                                                                            Vector
                                                                                                                                                                                             CONSUMER




                                                                                                                                                                                                                                                          Copyright c 1997-2006
                                                                             Douglas C. Schmidt




                                                                                                                                                                                                              Stack
Copyright c 1997-2006      Vanderbilt University                       28




Douglas C. Schmidt                                 OO Programming with C++   Douglas C. Schmidt                                                                                                                                      OO Programming with C++

                         Vector Interface                                                                                                                                                 Vector Implementation
   Using class Vector as a base class for a derived class such as            template class T
   class Checked Vector or class Ada Vector                                  VectorT::Vector (size_t s): size_ (s), buf_ (new T[s])
/* Bare-bones Vector implementation, fast but not safe:                      {}
    the array of elements is uninitialized,  ranges are
    not checked. Also, assignment is not supported. */                       template class T
template class T class Vector {                                            VectorT::˜Vector (void) { delete [] this-buf_; }
public:
   Vector (size_t s);                                                        template class T size_t
   ˜Vector (void);                                                           VectorT::size (void) const { return this-size_; }
   size_t size (void) const;
   T operator[] (size_t index);                                             template class T T 
private:                                                                     VectorT::operator[] (size_t i)
   T *buf_;                                                                  {
   size_t size_;                                                               return this-buf_[i];
};                                                                           }

Copyright c 1997-2006      Vanderbilt University                       30    Copyright c 1997-2006                                                                                                  Vanderbilt University                                31
Douglas C. Schmidt                                    OO Programming with C++   Douglas C. Schmidt                                      OO Programming with C++

                            Vector Use-case                                                             Benefits of Inheritance
int
                                                                                   Inheritance enables modification and/or extension of ADTs without
main (int, char *[])
{
                                                                                   changing the original source code
  Vectorint v (10);                                                              – e.g., someone may want a variation on the basic Vector
                                                                                     abstraction:
    v[6] = v[5] + 4; // oops, no initial values                                     1. A vector whose bounds are checked on every reference
                                                                                    2. Allow vectors to have lower bounds other than 0
    int i = v[v.size ()]; // oops, out of range!                                    3. Other vector variants are possible too . . .
                                                                                        e.g., automatically-resizing vectors, initialized vectors, etc.
    // destructor automatically called
}                                                                                  This is done by defining new derived classes that inherit the
                                                                                   characteristics of the Vector base class
                                                                                   – Note that inheritance also allows code to be shared



Copyright c 1997-2006         Vanderbilt University                       32    Copyright c 1997-2006         Vanderbilt University                         33




Douglas C. Schmidt                                    OO Programming with C++   Douglas C. Schmidt                                      OO Programming with C++

                        Checked Vector Interface                                                Implementation of Checked Vector
    The following allows run-time range checking:                               template class T int
    /* File Checked-Vector.h (incomplete wrt                                    Checked_VectorT::in_range (size_t i) const {
       initialization  assignment) */                                            return i  this-size (); }
    struct Range_Error { Range_Error (size_t index); /* ... */ };
                                                                                template class T
    template class T                                                          Checked_VectorT::Checked_Vector (size_t s)
    class Checked_Vector : public VectorT {
                                                                                : inherited (s) {}
    public:
      Checked_Vector (size_t s);
      T operator[] (size_t i) throw (Range_Error);                             template class T T 
      // Vector::size () inherited from base class Vector.                      Checked_VectorT::operator[] (size_t i)
    protected:                                                                    throw (Range_Error) {
      int in_range (size_t i) const;                                              if (this-in_range (i))
    private:                                                                        return (*(inherited *) this)[i];
      typedef VectorT inherited;                                                  // equivalent to: return inherited::operator[](i);
    };
                                                                                  else throw Range_Error (i); }

Copyright c 1997-2006         Vanderbilt University                       34    Copyright c 1997-2006         Vanderbilt University                         35
Douglas C. Schmidt                                    OO Programming with C++   Douglas C. Schmidt                                  OO Programming with C++

                        Checked Vector Use-case                                           Describing Relationships Between Classes
#include Checked_Vector.h
                                                                                   Consumer/Composition/Aggregation
typedef Checked_Vectorint CV_int;
                                                                                   – A class is a consumer of another class when it makes use of the
int foo (int size)                                                                   other class’s services, as defined in its interface
{                                                                                     For example, our Bounded Stack implementation relies on
  try                                                                                  Array for its implementation,  thus is consumer of the Array
  {                                                                                    class
    CV_int cv (size);                                                              – Consumers are used to describe a Has-A relationship
    int i = cv[cv.size ()]; // Error detected!
      // exception raised . . .                                                    Descendant/Inheritance/Specialization
      // Call base class destructor                                                – A class is a descendant of one or more other classes when it is
  }                                                                                  designed as an extension or specialization of these classes. This
  catch (Range_Error)                                                                is the notion of inheritance
  { /* . . . */ }                                                                  – Descendants are used to describe an Is-A relationship
}

Copyright c 1997-2006         Vanderbilt University                       36    Copyright c 1997-2006       Vanderbilt University                       37




Douglas C. Schmidt                                    OO Programming with C++   Douglas C. Schmidt                                  OO Programming with C++

            Interface vs. Implementation Inheritance                                     The Dangers of Implementation Inheritance
                                                                                   Using inheritance for reuse may sometimes be a dangerous misuse
   Class inheritance can be used in two primary ways:                              of the technique
  1. Interface inheritance: a method of creating a subtype of an                   – Operations that are valid for the base type may not apply to the
     existing class for purposes of setting up dynamic binding, e.g.,                derived type at all
     – Circle is a subclass of Shape (i.e., Is-A relation)                            e.g., performing an subscript operation on a stack is a
     – A Birthday is a subclass of Date                                                meaningless  potentially harmful operation
  2. Implementation inheritance: a method of reusing an                                              class Stack : public Vector { /* . . . */ };
     implementation to create a new class type                                                       Stack s;
     – e.g., a class Stack that inherits from class Vector. A Stack is not                           s[10] = 20; // could be big trouble!
       really a subtype or specialization of Vector                                – In C++, the use of a private base class minimizes the dangers
     – In this case, inheritance makes implementation easier, because                 i.e., if a class is derived “private,” it is illegal to assign the
       there is no need to rewrite  debug existing code.                              address of a derived object to a pointer to a base object
     – This is called using inheritance for reuse                                  – On the other hand, a consumer/Has-A relation might be more
     – i.e., a pseudo-Has-A relation                                                 appropriate . . .

Copyright c 1997-2006         Vanderbilt University                       38    Copyright c 1997-2006       Vanderbilt University                       39
Douglas C. Schmidt                                     OO Programming with C++   Douglas C. Schmidt                                 OO Programming with C++

           Private vs Public vs Protected Derivation                                                     Public Derivation
   Access control specifiers (i.e., public, private, protected) are also          class A {                           class B : public A {
   meaningful in the context of inheritance                                      public:                             public:
                                                                                    public A                          [public A]
   In the following examples:                                                    protected:                             public B
   – . . . . represents actual (omitted) code                                     protected A                    protected:
   – [. . . .] is implicit                                                       private:                               [protected A]
                                                                                    private A                         protected B
   Note, all the examples work for both data members  methods                   };                                  private:
                                                                                                                        private B
                                                                                                                     };




Copyright c 1997-2006         Vanderbilt University                        40    Copyright c 1997-2006      Vanderbilt University                       41




Douglas C. Schmidt                                     OO Programming with C++   Douglas C. Schmidt                                 OO Programming with C++

                        Protected Derivation                                                             Private Derivation
class A {                              class B : protected A {                   class A {                           class B : private A {
public:                                public:                                   public:                             // same as class B : A
   public A                             public B                                public A                       public:
protected:                             protected:                                private:                               public B
   protected A                          [protected A]                             private A                      protected:
private:                                  [public A]                             protected:                             protected B
   private A                            protected B                             protected A                    private:
};                                     private:                                  };                                     [public A]
                                          private B                                                                   [protected A]
                                       };                                                                               private B
                                                                                                                     };




Copyright c 1997-2006         Vanderbilt University                        42    Copyright c 1997-2006      Vanderbilt University                       43
Douglas C. Schmidt                                    OO Programming with C++   Douglas C. Schmidt                                    OO Programming with C++

       Derived Class Access to Base Class Members                                           Other Uses of Access Control Specifiers
           Base Class                Inheritance mode                              Selectively redefine visibility of individual methods inherited from
           Access Control       public    protected private                        base classes. NOTE: the redifinition can only be to the visibility of
           public               public    protected private                        the base class. Selective redefinition can only override the
           protected          protected protected private                          additional control imposed by inheritance.
           private              none         none     none
                                                                                class A {                              class B : private A {
                                                                                public:                                public:
   The vertical axis represents the access rights specified in the base
                                                                                   int f (void);                          A::f; // Make public
   class
                                                                                   int g_;                             protected:
   The horizontal access represents the mode of inheritance used by                . . .                                  A::g_; // Make protected
   the derived class                                                            private:                               };
                                                                                   int p_;
   Note that the resulting access is always the most restrictive of the         };
   two

Copyright c 1997-2006        Vanderbilt University                        44    Copyright c 1997-2006         Vanderbilt University                       45




Douglas C. Schmidt                                    OO Programming with C++   Douglas C. Schmidt                                    OO Programming with C++

      Common Issues with Access Control Specifiers                                        General Rules for Access Control Specifiers
   It is an error to increase the access of an inherited method above              Private methods of the base class are not accessible to a derived
   the level given in the base class                                               class (unless the derived class is a friend of the base class)
   Deriving publicly  then selectively decreasing the visibility of base          If the subclass is derived publicly then:
   class methods in the derived class should be used with caution:
                                                                                  1. Public methods of the base class are accessible to the derived
   removes methods from the public interface at lower scopes in the
                                                                                     class
   inheritance hierarchy.
                                                                                  2. Protected methods of the base class are accessible to derived
                                                                                     classes  friends only
// Error if p_ is                     class B : public A {
// protected in A!                    private:
class B : private A {                    A::f; // hides A::f
public:                               };
   A::p_;
};

Copyright c 1997-2006        Vanderbilt University                        46    Copyright c 1997-2006         Vanderbilt University                       47
Douglas C. Schmidt                                  OO Programming with C++   Douglas C. Schmidt                                      OO Programming with C++

                              Caveats                                                                      Caveats, example
                                                                              class Vector {
   Using protected methods weakens the data hiding mechanism
                                                                              public:
   because changes to the base class implementation might affect all
                                                                                 // . . .
   derived classes.
                                                                              protected:
   However, performance  design reasons may dictate use of the                  // allow derived classes direct access
   protected access control specifier                                             T *buf_;
                                                                                 size_t size_;
   – Note, inlining functions often reduces the need for these efficiency      };
     hacks.                                                                   class Ada_Vector : public Vector {
                                                                              public:
                                                                                 T operator() (size_t i) {
                                                                                   return this-buf_[i];
                                                                                 } // Note the strong dependency on the buf_
                                                                              };


Copyright c 1997-2006       Vanderbilt University                       48    Copyright c 1997-2006           Vanderbilt University                       49




Douglas C. Schmidt                                  OO Programming with C++   Douglas C. Schmidt                                      OO Programming with C++

             Overview of Multiple Inheritance in C++                                               Liabilities of Multiple Inheritance
   C++ allows multiple inheritance                                               A base class may legally appear only once in a derivation list, e.g.,
   – i.e., a class can be simultaneously derived from two or more base           class Two_Vect : public Vect, public Vect // ERROR!
     classes, e.g.,
                                                                                 However, a base class may appear multiple times within a derivation
     class X { /* . . . */ };
                                                                                 hierarchy
     class Y : public X { /* . . . */ };
     class Z : public X { /* . . . */ };                                         – e.g., class YZ contains two instances of class X
     class YZ : public Y, public Z { /* . . . */ };
   – Derived classes Y, Z,  YZ inherit the data members  methods               This leads to two problems with multiple inheritance:
     from their respective base classes                                         1. It gives rise to a form of method  data member ambiguity
                                                                                   – Explicitly qualified names  additional methods are used to
                                                                                      resolve this
                                                                                2. It also may cause unnecessary duplication of storage
                                                                                   – Virtual base classes are used to resolve this


Copyright c 1997-2006       Vanderbilt University                       50    Copyright c 1997-2006           Vanderbilt University                       51
Douglas C. Schmidt                                                    OO Programming with C++   Douglas C. Schmidt                                     OO Programming with C++

                Motivation for Virtual Base Classes                                                                  Overview of Virtual Base Classes
   Consider a user who wants an Init_Checked_Vector:                                               Virtual base classes allow class designers to specify that a base
                                                                                                   class will be shared among derived classes
   class Checked_Vector : public virtual Vector
   { /* . . . */ };                                                                                – No matter how often a virtual base class may occur in a derivation
   class Init_Vector : public virtual Vector                                                         hierarchy, only one shared instance is generated when an object
   { /* . . . */ };                                                                                  is instantiated
   class Init_Checked_Vector :                                                                        Under the hood, pointers are used in derived classes that
     public Checked_Vector, public Init_Vector                                                          contain virtual base classes
   { /* . . . */ };                                                                                Understanding  using virtual base classes correctly is a non-trivial
   In this example, the virtual keyword, when applied to a base class,                             task because you must plan in advance
   causes Init_Checked_Vector to get one Vector base class                                         – Also, you must be aware when initializing subclasses objects . . .
   instead of two
                                                                                                   However, virtual base classes are used to implement the client 
                                                                                                   server side of many implementations of CORBA distributed objects

Copyright c 1997-2006             Vanderbilt University                                   52    Copyright c 1997-2006          Vanderbilt University                       53




Douglas C. Schmidt                                                    OO Programming with C++   Douglas C. Schmidt                                     OO Programming with C++

                     Virtual Base Classes Illustrated                                                                Initializing Virtual Base Classes
                                                                                                   With C++ you must chose one of two methods to make constructors
                         Vector
                                                                                                   work correctly for virtual base classes:
                                   NON-VIRTUAL               Vector
                                   INHERITANCE                                                    1. You need to either supply a constructor in a virtual base class that
                                                                                                     takes no arguments (or has default arguments), e.g.,
                        Checked        Init               Checked                                    Vector::Vector (size_t size = 100); // not clean!
                         Vector      Checked               Vector
                                      Vector
                                                                                                  2. Or, you must make sure the most derived class calls the
                                                                                                     constructor for the virtual base class in its base initialization
                                   Vector
                                                                                                     section, e.g.,
                             v                        v                                              Init_Checked_Vector (size_t size, const T init):
                                    VIRTUAL
                                  INHERITANCE                                                              Vector (size), Check_Vector (size),
                        Checked
                                        Init               Checked                                         Init_Vector (size, init)
                         Vector                             Vector
                                      Checked
                                       Vector




Copyright c 1997-2006             Vanderbilt University                                   54    Copyright c 1997-2006          Vanderbilt University                       55
Douglas C. Schmidt                                OO Programming with C++   Douglas C. Schmidt                                    OO Programming with C++

            Virtual Base Class Initialization Example                           Virtual Base Class Initialization Example, (cont’d)
#include iostream.h                                                       class Derived : public Derived1, public Derived2 {
class Base {                                                                public:
public:
                                                                               // The Derived constructor _must_ call the Base
  Base (int i) { cout  Base::Base (  i  )  endl; }
                                                                               // constructor explicitly, because Base doesn’t
};
                                                                               // have a default constructor.
class Derived1 : public virtual Base {                                         Derived (void) : Base (3) {
public:                                                                          cout  Derived (void)  endl;
  Derived1 (void) : Base (1) { cout  Derived1 (void)  endl; }            }
};                                                                          };
class Derived2 : public virtual Base {
public:
  Derived2 (void) : Base (2) { cout  Derived2 (void)  endl; }
};




Copyright c 1997-2006     Vanderbilt University                       56    Copyright c 1997-2006         Vanderbilt University                       57




Douglas C. Schmidt                                OO Programming with C++   Douglas C. Schmidt                                    OO Programming with C++

    Virtual Base Class Initialization Example, (cont’d)                                             Vector Interface Revised
int                                                                            The following example illustrates templates, multiple inheritance,
main (int, char *[])                                                           and virtual base classes in C++:
{                                                                              #include iostream.h
  Base b (0);   // Direct instantiation of Base:                               // A simple-minded Vector base class,
                //   Base::Base (0)                                            // no range checking, no initialization.
  Derived1 d1; // Instantiates Base via Derived1 ctor:                         template class T class Vector
                //   Base::Base (1)                                            {
  Derived2 d2; // Instantiates Base via Derived2 ctor:                         public:
                //   Base::Base (2)                                              Vector (size_t s): size_ (s), buf_ (new T[s]) {}
  Derived d;    // Instantiates Base via Derived ctor:                           T operator[] (size_t i) { return this-buf_[i]; }
                //   Base::Base (3)                                              size_t size (void) const { return this-size_; }
  return 0;                                                                    private:
}                                                                                size_t size_;
                                                                                 T *buf_;
                                                                               };

Copyright c 1997-2006     Vanderbilt University                       58    Copyright c 1997-2006         Vanderbilt University                       59
Douglas C. Schmidt                                       OO Programming with C++   Douglas C. Schmidt                                     OO Programming with C++

                            Init Vector Interface                                                          Checked Vector Interface
   A simple extension to the Vector base class, that enables                           Extend Vector to provide checked subscripting
   automagical vector initialization                                                   template class T
   template class T                                                                  class Checked_Vector : public virtual VectorT {
   class Init_Vector : public virtual VectorT                                        public:
   {                                                                                     Checked_Vector (size_t size): VectorT (size) {}
   public:                                                                               T operator[] (size_t i) throw (Range_Error) {
     Init_Vector (size_t size, const T init)                                               if (this-in_range (i)) return (*(inherited *) this)
       : VectorT (size)                                                                   else throw Range_Error (i);
     {                                                                                   }
       for (size_t i = 0; i  this-size (); i++)                                        // Inherits inherited::size.
         (*this)[i] = init;                                                            private:
     }                                                                                   typedef VectorT inherited;
     // Inherits subscripting operator  size().                                        int in_range (size_t i) const
   };                                                                                      { return i  this-size (); }
                                                                                       };

Copyright c 1997-2006            Vanderbilt University                       60    Copyright c 1997-2006          Vanderbilt University                       61




Douglas C. Schmidt                                       OO Programming with C++   Douglas C. Schmidt                                     OO Programming with C++

                        Init Checked Vector Interface                                                      Init Checked Vector Driver
                                                                                   int main (int argc, char *argv[]) {
   A simple multiple inheritance example that provides for both an
                                                                                     try {
   initialized and range checked Vector
                                                                                       size_t size = ::atoi (argv[1]);
template class T                                                                     size_t init = ::atoi (argv[2]);
class Init_Checked_Vector :                                                            Init_Checked_Vectorint v (size, init);
   public Checked_VectorT, public Init_VectorT {                                   cout  vector size =   v.size ()
public:                                                                                      , vector contents = ;
   Init_Checked_Vector (size_t size, const T init):
     VectorT (size),                                                                    for (size_t i = 0; i  v.size (); i++)
     Init_VectorT (size, init),                                                           cout  v[i];
     Checked_VectorT (size) {}
   // Inherits Checked_Vector::operator[]                                                cout  n  ++v[v.size () - 1]  n;
};                                                                                     }
                                                                                       catch (Range_Error) { /* . . . */ }
                                                                                   }

Copyright c 1997-2006            Vanderbilt University                       62    Copyright c 1997-2006          Vanderbilt University                       63
Douglas C. Schmidt                                        OO Programming with C++   Douglas C. Schmidt                                   OO Programming with C++

                     Multiple Inheritance Ambiguity                                              Multiple Inheritance Ambiguity, (cont’d)
   Consider the following:                                                             There are two ways to fix this problem:
   struct Base_1 { int foo (void);                    /* . . . */ };                  1. Explicitly qualify the call, by prefixing it with the name of the
   struct Base_2 { int foo (void);                    /* . . . */ };                     intended base class using the scope resolution operator, e.g.,
   struct Derived : Base_1, Base_2                    { /* . . . */ };                      d.Base_1::foo (); // or d.Base_2::foo ()
   int main (int, char *[]) {                                                         2. Add a new method foo to class Derived (similar to Eiffel’s
     Derived d;                                                                          renaming concept) e.g.,
     d.foo (); // Error, ambiguous                    call to foo ()                     struct Derived : Base_1, Base_2 {
   }                                                                                          int foo (void) {
                                                                                                  Base_1::foo (); // either, both
                                                                                                  Base_2::foo (); // or neither
                                                                                              }
                                                                                            };



Copyright c 1997-2006         Vanderbilt University                           64    Copyright c 1997-2006        Vanderbilt University                       65




Douglas C. Schmidt                                        OO Programming with C++

                               Summary
   Inheritance supports evolutionary, incremental development of
   reusable components by specializing and/or extending a general
   interface/implementation
   Inheritance adds a new dimension to data abstraction, e.g.,
   – Classes (ADTs) support the expression of commonality where the
     general aspects of an application are encapsulated in a few base
     classes
   – Inheritance supports the development of the application by
     extension and specialization without affecting existing code . . .
   Without browser support, navigating through complex inheritance
   hierarchies is difficult . . . tools can help.



Copyright c 1997-2006         Vanderbilt University                           66

More Related Content

Viewers also liked

Koffieochtend Pernis
Koffieochtend PernisKoffieochtend Pernis
Koffieochtend PernisPernisOnline
 
Need to grow your sales?
Need to grow your sales?Need to grow your sales?
Need to grow your sales?Hans Österman
 
Science and the Bible
Science and the BibleScience and the Bible
Science and the BibleMs Keleghan
 
Using Endnote with UWS Referencing Guidelines - Margo Stewart (Subject Librar...
Using Endnote with UWS Referencing Guidelines - Margo Stewart (Subject Librar...Using Endnote with UWS Referencing Guidelines - Margo Stewart (Subject Librar...
Using Endnote with UWS Referencing Guidelines - Margo Stewart (Subject Librar...lah32
 
Did Darwin Kill God?
Did Darwin Kill God?Did Darwin Kill God?
Did Darwin Kill God?Ms Keleghan
 
Motivating Learners: Using video for learning and teaching
Motivating Learners: Using video for learning and teachingMotivating Learners: Using video for learning and teaching
Motivating Learners: Using video for learning and teachinglah32
 
PowerPoint Transitions and Animations
PowerPoint Transitions and AnimationsPowerPoint Transitions and Animations
PowerPoint Transitions and Animationslah32
 
The commonwealth games
The commonwealth gamesThe commonwealth games
The commonwealth gameslah32
 

Viewers also liked (12)

Crystal
CrystalCrystal
Crystal
 
Koffieochtend Pernis
Koffieochtend PernisKoffieochtend Pernis
Koffieochtend Pernis
 
Sean O'Riada
Sean O'RiadaSean O'Riada
Sean O'Riada
 
Need to grow your sales?
Need to grow your sales?Need to grow your sales?
Need to grow your sales?
 
Planet X part 2
Planet X part 2Planet X part 2
Planet X part 2
 
Planet X
Planet X Planet X
Planet X
 
Science and the Bible
Science and the BibleScience and the Bible
Science and the Bible
 
Using Endnote with UWS Referencing Guidelines - Margo Stewart (Subject Librar...
Using Endnote with UWS Referencing Guidelines - Margo Stewart (Subject Librar...Using Endnote with UWS Referencing Guidelines - Margo Stewart (Subject Librar...
Using Endnote with UWS Referencing Guidelines - Margo Stewart (Subject Librar...
 
Did Darwin Kill God?
Did Darwin Kill God?Did Darwin Kill God?
Did Darwin Kill God?
 
Motivating Learners: Using video for learning and teaching
Motivating Learners: Using video for learning and teachingMotivating Learners: Using video for learning and teaching
Motivating Learners: Using video for learning and teaching
 
PowerPoint Transitions and Animations
PowerPoint Transitions and AnimationsPowerPoint Transitions and Animations
PowerPoint Transitions and Animations
 
The commonwealth games
The commonwealth gamesThe commonwealth games
The commonwealth games
 

Similar to C++ inherit4

Designing Secure Cisco Data Centers
Designing Secure Cisco Data CentersDesigning Secure Cisco Data Centers
Designing Secure Cisco Data CentersCisco Russia
 
Simple regenerating codes: Network Coding for Cloud Storage
Simple regenerating codes: Network Coding for Cloud StorageSimple regenerating codes: Network Coding for Cloud Storage
Simple regenerating codes: Network Coding for Cloud StorageKevin Tong
 
Enhancing Privacy of Confidential Data using K Anonymization
Enhancing Privacy of Confidential Data using K AnonymizationEnhancing Privacy of Confidential Data using K Anonymization
Enhancing Privacy of Confidential Data using K AnonymizationIDES Editor
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programmingmukhtarhudaya
 
thilaganga journal 1
thilaganga journal 1thilaganga journal 1
thilaganga journal 1thilaganga
 
Distributed Database System
Distributed Database SystemDistributed Database System
Distributed Database SystemSulemang
 
MongoDB on Windows Azure
MongoDB on Windows AzureMongoDB on Windows Azure
MongoDB on Windows AzureJeremy Taylor
 
Bs it itc questions{imtiaz hussain}
Bs it itc questions{imtiaz hussain}Bs it itc questions{imtiaz hussain}
Bs it itc questions{imtiaz hussain}Imtiaz Husssain
 
Database security technique with database cache
Database security technique with database cacheDatabase security technique with database cache
Database security technique with database cacheIJARIIT
 
Database management system overview
Database management system overviewDatabase management system overview
Database management system overviewNj Saini
 
Big data analytics K.Kiruthika II-M.Sc.,Computer Science Bonsecours college f...
Big data analytics K.Kiruthika II-M.Sc.,Computer Science Bonsecours college f...Big data analytics K.Kiruthika II-M.Sc.,Computer Science Bonsecours college f...
Big data analytics K.Kiruthika II-M.Sc.,Computer Science Bonsecours college f...Kiruthikak14
 
Slicing%20 a%20new%20approach%20to%20privacy%20preserving%20data%20publishing
Slicing%20 a%20new%20approach%20to%20privacy%20preserving%20data%20publishingSlicing%20 a%20new%20approach%20to%20privacy%20preserving%20data%20publishing
Slicing%20 a%20new%20approach%20to%20privacy%20preserving%20data%20publishingSunkaraHariNarayana
 
database concepts pdf :BEMIT
database concepts pdf :BEMITdatabase concepts pdf :BEMIT
database concepts pdf :BEMITUsman Mchinja
 

Similar to C++ inherit4 (20)

ieee title
ieee titleieee title
ieee title
 
Designing Secure Cisco Data Centers
Designing Secure Cisco Data CentersDesigning Secure Cisco Data Centers
Designing Secure Cisco Data Centers
 
Simple regenerating codes: Network Coding for Cloud Storage
Simple regenerating codes: Network Coding for Cloud StorageSimple regenerating codes: Network Coding for Cloud Storage
Simple regenerating codes: Network Coding for Cloud Storage
 
Harsh
HarshHarsh
Harsh
 
Hibernating DDS
Hibernating DDSHibernating DDS
Hibernating DDS
 
Enhancing Privacy of Confidential Data using K Anonymization
Enhancing Privacy of Confidential Data using K AnonymizationEnhancing Privacy of Confidential Data using K Anonymization
Enhancing Privacy of Confidential Data using K Anonymization
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
 
thilaganga journal 1
thilaganga journal 1thilaganga journal 1
thilaganga journal 1
 
Distributed Database System
Distributed Database SystemDistributed Database System
Distributed Database System
 
MongoDB on Windows Azure
MongoDB on Windows AzureMongoDB on Windows Azure
MongoDB on Windows Azure
 
02 Distributed DBMSTechnology
02 Distributed DBMSTechnology02 Distributed DBMSTechnology
02 Distributed DBMSTechnology
 
Bs it itc questions{imtiaz hussain}
Bs it itc questions{imtiaz hussain}Bs it itc questions{imtiaz hussain}
Bs it itc questions{imtiaz hussain}
 
DDS Made Simple
DDS Made SimpleDDS Made Simple
DDS Made Simple
 
Database security technique with database cache
Database security technique with database cacheDatabase security technique with database cache
Database security technique with database cache
 
Database management system overview
Database management system overviewDatabase management system overview
Database management system overview
 
Big data analytics K.Kiruthika II-M.Sc.,Computer Science Bonsecours college f...
Big data analytics K.Kiruthika II-M.Sc.,Computer Science Bonsecours college f...Big data analytics K.Kiruthika II-M.Sc.,Computer Science Bonsecours college f...
Big data analytics K.Kiruthika II-M.Sc.,Computer Science Bonsecours college f...
 
Gfs论文
Gfs论文Gfs论文
Gfs论文
 
The google file system
The google file systemThe google file system
The google file system
 
Slicing%20 a%20new%20approach%20to%20privacy%20preserving%20data%20publishing
Slicing%20 a%20new%20approach%20to%20privacy%20preserving%20data%20publishingSlicing%20 a%20new%20approach%20to%20privacy%20preserving%20data%20publishing
Slicing%20 a%20new%20approach%20to%20privacy%20preserving%20data%20publishing
 
database concepts pdf :BEMIT
database concepts pdf :BEMITdatabase concepts pdf :BEMIT
database concepts pdf :BEMIT
 

Recently uploaded

4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptx4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptxmary850239
 
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...Postal Advocate Inc.
 
Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...Jisc
 
Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)
Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)
Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)lakshayb543
 
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptxMULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptxAnupkumar Sharma
 
Choosing the Right CBSE School A Comprehensive Guide for Parents
Choosing the Right CBSE School A Comprehensive Guide for ParentsChoosing the Right CBSE School A Comprehensive Guide for Parents
Choosing the Right CBSE School A Comprehensive Guide for Parentsnavabharathschool99
 
Proudly South Africa powerpoint Thorisha.pptx
Proudly South Africa powerpoint Thorisha.pptxProudly South Africa powerpoint Thorisha.pptx
Proudly South Africa powerpoint Thorisha.pptxthorishapillay1
 
How to do quick user assign in kanban in Odoo 17 ERP
How to do quick user assign in kanban in Odoo 17 ERPHow to do quick user assign in kanban in Odoo 17 ERP
How to do quick user assign in kanban in Odoo 17 ERPCeline George
 
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17Celine George
 
ENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomnelietumpap1
 
DATA STRUCTURE AND ALGORITHM for beginners
DATA STRUCTURE AND ALGORITHM for beginnersDATA STRUCTURE AND ALGORITHM for beginners
DATA STRUCTURE AND ALGORITHM for beginnersSabitha Banu
 
ANG SEKTOR NG agrikultura.pptx QUARTER 4
ANG SEKTOR NG agrikultura.pptx QUARTER 4ANG SEKTOR NG agrikultura.pptx QUARTER 4
ANG SEKTOR NG agrikultura.pptx QUARTER 4MiaBumagat1
 
Keynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-designKeynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-designMIPLM
 
Science 7 Quarter 4 Module 2: Natural Resources.pptx
Science 7 Quarter 4 Module 2: Natural Resources.pptxScience 7 Quarter 4 Module 2: Natural Resources.pptx
Science 7 Quarter 4 Module 2: Natural Resources.pptxMaryGraceBautista27
 
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxiammrhaywood
 
Gas measurement O2,Co2,& ph) 04/2024.pptx
Gas measurement O2,Co2,& ph) 04/2024.pptxGas measurement O2,Co2,& ph) 04/2024.pptx
Gas measurement O2,Co2,& ph) 04/2024.pptxDr.Ibrahim Hassaan
 
Q4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptxQ4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptxnelietumpap1
 

Recently uploaded (20)

4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptx4.18.24 Movement Legacies, Reflection, and Review.pptx
4.18.24 Movement Legacies, Reflection, and Review.pptx
 
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
USPS® Forced Meter Migration - How to Know if Your Postage Meter Will Soon be...
 
Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...Procuring digital preservation CAN be quick and painless with our new dynamic...
Procuring digital preservation CAN be quick and painless with our new dynamic...
 
Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)
Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)
Visit to a blind student's school🧑‍🦯🧑‍🦯(community medicine)
 
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptxMULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
MULTIDISCIPLINRY NATURE OF THE ENVIRONMENTAL STUDIES.pptx
 
Choosing the Right CBSE School A Comprehensive Guide for Parents
Choosing the Right CBSE School A Comprehensive Guide for ParentsChoosing the Right CBSE School A Comprehensive Guide for Parents
Choosing the Right CBSE School A Comprehensive Guide for Parents
 
Proudly South Africa powerpoint Thorisha.pptx
Proudly South Africa powerpoint Thorisha.pptxProudly South Africa powerpoint Thorisha.pptx
Proudly South Africa powerpoint Thorisha.pptx
 
How to do quick user assign in kanban in Odoo 17 ERP
How to do quick user assign in kanban in Odoo 17 ERPHow to do quick user assign in kanban in Odoo 17 ERP
How to do quick user assign in kanban in Odoo 17 ERP
 
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
 
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
Incoming and Outgoing Shipments in 3 STEPS Using Odoo 17
 
ENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choomENGLISH6-Q4-W3.pptxqurter our high choom
ENGLISH6-Q4-W3.pptxqurter our high choom
 
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptxLEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
LEFT_ON_C'N_ PRELIMS_EL_DORADO_2024.pptx
 
DATA STRUCTURE AND ALGORITHM for beginners
DATA STRUCTURE AND ALGORITHM for beginnersDATA STRUCTURE AND ALGORITHM for beginners
DATA STRUCTURE AND ALGORITHM for beginners
 
ANG SEKTOR NG agrikultura.pptx QUARTER 4
ANG SEKTOR NG agrikultura.pptx QUARTER 4ANG SEKTOR NG agrikultura.pptx QUARTER 4
ANG SEKTOR NG agrikultura.pptx QUARTER 4
 
Keynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-designKeynote by Prof. Wurzer at Nordex about IP-design
Keynote by Prof. Wurzer at Nordex about IP-design
 
Science 7 Quarter 4 Module 2: Natural Resources.pptx
Science 7 Quarter 4 Module 2: Natural Resources.pptxScience 7 Quarter 4 Module 2: Natural Resources.pptx
Science 7 Quarter 4 Module 2: Natural Resources.pptx
 
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptxECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
ECONOMIC CONTEXT - PAPER 1 Q3: NEWSPAPERS.pptx
 
FINALS_OF_LEFT_ON_C'N_EL_DORADO_2024.pptx
FINALS_OF_LEFT_ON_C'N_EL_DORADO_2024.pptxFINALS_OF_LEFT_ON_C'N_EL_DORADO_2024.pptx
FINALS_OF_LEFT_ON_C'N_EL_DORADO_2024.pptx
 
Gas measurement O2,Co2,& ph) 04/2024.pptx
Gas measurement O2,Co2,& ph) 04/2024.pptxGas measurement O2,Co2,& ph) 04/2024.pptx
Gas measurement O2,Co2,& ph) 04/2024.pptx
 
Q4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptxQ4 English4 Week3 PPT Melcnmg-based.pptx
Q4 English4 Week3 PPT Melcnmg-based.pptx
 

C++ inherit4

  • 1. Douglas C. Schmidt OO Programming with C++ Background Object-oriented programming is often defined as the combination of Abstract Data Types (ADTs) with Inheritance & Dynamic Binding Single & Multiple Inheritance in C++ Each concept addresses a different aspect of system decomposition: Douglas C. Schmidt 1. ADTs decompose systems into two-dimensional grids of modules Professor Department of EECS – Each module has public & private interfaces d.schmidt@vanderbilt.edu Vanderbilt University 2. Inheritance decomposes systems into three-dimensional www.dre.vanderbilt.edu/schmidt/ (615) 343-8197 hierarchies of modules – Inheritance relationships form a lattice 3. Dynamic binding enhances inheritance – e.g., defer implementation decisions until late in the design phase or even until run-time! Copyright c 1997-2006 Vanderbilt University 1 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Data Abstraction vs. Inheritance Motivation for Inheritance Inheritance allows you to write code to handle certain cases DATA ABSTRACTION DATA ABSTRACTION (2 DIMENTIONAL) (2 DIMENTIONAL) allows other developers to write code that handles more specialized cases, while your code continues to work Inheritance partitions a system architecture into semi-disjoint components that are related hierarchically Therefore, we may be able to modify and/or reuse sections of the inheritance hierarchy without disturbing existing code, e.g., – Change sibling subtree interfaces i.e., a consequence of inheritance – Change implementation of ancestors INHERITANCE i.e., a consequence of data abstraction (3 DIMENTIONAL) Copyright c 1997-2006 Vanderbilt University 2 Copyright c 1997-2006 Vanderbilt University 3
  • 2. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Inheritance Overview Visualizing Inheritance A type (called a subclass or derived type) can inherit the characteristics of another type(s) (called a superclass or base type) – The term subclass is equivalent to derived type Base Derived A derived type acts just like the base type, except for an explicit list 2 of: Derived 1 1. Specializations Derived – Change implementations without changing the base class 5 interface – Most useful when combined with dynamic binding Derived Derived 4 2. Generalizations/Extensions 3 Derived – Add new operations or data to derived classes 6 Copyright c 1997-2006 Vanderbilt University 4 Copyright c 1997-2006 Vanderbilt University 5 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Types of Inheritance Inheritance Trees vs. Inheritance DAGs Inheritance comes in two forms, depending on number of parents a subclass has Base Derived Derived 1. Single Inheritance (SI) 1 2 – Only one parent per derived class – Form an inheritance tree INHERITANCE Derived – SI requires a small amount of run-time overhead when used Derived TREE 4 3 with dynamic binding – e.g., Smalltalk, Simula, Object Pascal 2. Multiple Inheritance (MI) Base Base – More than one parent per derived class 1 Derived 2 1 – Forms an inheritance Directed Acyclic Graph (DAG) – Compared with SI, MI adds additional run-time overhead (also INHERITANCE involving dynamic binding) Derived Derived 3 DAG 4 – e.g., C++, Eiffel, Flavors (a LISP dialect) Copyright c 1997-2006 Vanderbilt University 6 Copyright c 1997-2006 Vanderbilt University 7
  • 3. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Inheritance Benefits Inheritance Liabilities 1. Increase reuse software quality 1. May create deep and/or wide hierarchies that are hard to understand Programmers reuse the base classes instead of writing new navigate without class browser tools classes – Integrates black-box white-box reuse by allowing extensibility 2. May decrease performance slightly and modification without changing existing code i.e., when combined with multiple inheritance dynamic binding Using well-tested base classes helps reduce bugs in applications that use them 3. Without dynamic binding, inheritance has limited utility, i.e., can only Reduce object code size be used for implementation inheritance 2. Enhance extensibility comprehensibility dynamic binding is essentially pointless without inheritance Helps support more flexible extensible architectures (along with dynamic binding) 4. Brittle hierarchies, which may impose dependencies upon ancestor names – i.e., supports the open/closed principle Often useful for modeling classifying hierarchically-related domains Copyright c 1997-2006 Vanderbilt University 8 Copyright c 1997-2006 Vanderbilt University 9 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Inheritance in C++ Key Properties of C++ Inheritance The base/derived class relationship is explicitly recognized in C++ Deriving a class involves an extension to the C++ class declaration by predefined standard conversions syntax – i.e., a pointer to a derived class may always be assigned to a The class head is modified to allow a derivation list consisting of pointer to a base class that was inherited publicly base classes, e.g., But not vice versa . . . When combined with dynamic binding, this special relationship class Foo { /* . . . */ }; between inherited class types promotes a type-secure, polymorphic class Bar : public Foo { /* . . . */ }; style of programming class Baz : public Foo, public Bar { /* . . . */ }; – i.e., the programmer need not know the actual type of a class at compile-time – Note, C++ is not arbitrarily polymorphic i.e., operations are not applicable to objects that don’t contain definitions of these operations at some point in their inheritance hierarchy Copyright c 1997-2006 Vanderbilt University 10 Copyright c 1997-2006 Vanderbilt University 11
  • 4. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Simple Screen Class Subclassing from Screen class Screen { /* Base class. */ public: class Screen can be a public base class of class Window, e.g., Screen (int = 8, int = 40, char = ’ ’); class Window : public Screen { ˜Screen (void); public: short height (void) const { return this-height_; } Window (const Point , int rows = 24, short width (void) const { return this-width_; } int columns = 80, char default_char = ’ ’); void height (short h) { this-height_ = h; } void set_foreground_color (Color ); void width (short w) { this-width_ = w; } void set_background_color (Color ); Screen forward (void); void resize (int height, int width); Screen up (void); Screen down (void); // . . . Screen home (void); Screen bottom (void); private: Screen display (void); Screen copy (const Screen ); Point center_; private: Color foreground_; short height_, width_; Color background_; char *screen_, *cur_pos_; }; }; Copyright c 1997-2006 Vanderbilt University 12 Copyright c 1997-2006 Vanderbilt University 13 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Multiple Levels of Derivation The Screen Inheritance Hierarchy A derived class can itself form the basis for further derivation, e.g., ls0.9 class Menu : public Window { Point public: void set_label (const char *l); Screen Menu (const Point , int rows = 24, Color int columns = 80, char default_char = ’ ’); // . . . private: Window char *label_; Menu }; class Menu inherits data methods from both Window Screen, i.e., sizeof (Menu) = sizeof (Window) = sizeof (Screen) Screen/Window/Menu hierarchy Copyright c 1997-2006 Vanderbilt University 14 Copyright c 1997-2006 Vanderbilt University 15
  • 5. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Variations on a Screen . . . Using the Screen Hierarchy class Screen { ps1 : public: virtual void dump (ostream ); }; ps2 : Screen class Window : public Screen { Screen public: virtual void dump (ostream ); }; class Menu : public Window { w: public: virtual void dump (ostream ); Window Menu }; // stand-alone function void dump_image (Screen *s, ostream o) { // Some processing omitted A pointer to a derived class can be assigned to a pointer to any of its s-dump (o); public base classes without requiring an explicit cast: // translates to: (*s-vptr[1]) (s, o)); Menu m; Window w = m; Screen *ps1 = w; } Screen *ps2 = m; Copyright c 1997-2006 Vanderbilt University 16 Copyright c 1997-2006 Vanderbilt University 17 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Using the Screen Hierarchy, (cont’d) Using Inheritance for Specialization Screen s; Window w; Menu m; A derived class specializes a base class by adding new, more Bit_Vector bv; specific state variables methods // OK: Window is a kind of Screen – Method use the same interface, even though they are dump_image (w, cout); implemented differently // OK: Menu is a kind of Screen i.e., “overridden” dump_image (m, cout); – Note, there is an important distinction between overriding, hiding, // OK: argument types match exactly overloading . . . dump_image (s, cout); // Error: Bit_Vector is not a kind of Screen! A variant of this is used in the Template Method pattern dump_image (bv, cout); – i.e., behavior of the base class relies on functionality supplied by the derived class – This is directly supported in C++ via abstract base classes pure virtual functions Copyright c 1997-2006 Vanderbilt University 18 Copyright c 1997-2006 Vanderbilt University 19
  • 6. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Specialization Example Specialization Example, (cont’d) Inheritance may be used to obtain the features of one data type in another closely related data type Class Birthday derives from Date, adding a name field, e.g., For example, we can create a class Date that represents an #include string arbitrary date: class Birthday : public Date { class Date { public: public: Birthday (const std::string n, int m, int d, int y) Date (int m, int d, int y); : Date (m, d, y), virtual void print (ostream s) const { person_ (n) { } s month_ day_ year_ std::endl; virtual void print (ostream s) const; } // . . . // . . . private: private: std::string person_; int month_, day_, year_; }; }; Copyright c 1997-2006 Vanderbilt University 20 Copyright c 1997-2006 Vanderbilt University 21 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Implementation Use-case Alternatives to Specialization Birthday::print() could print the person’s name as well as the date, e.g., Note that we could also use object composition (containment) void Birthday::print (ostream s) const { instead of inheritance for this example, e.g., s this-person_ was born on ; Date::print (s); s std::endl; class Birthday { } public: Birthday (const std::string n, int m, int d, int y): const Date july_4th (7, 4, 1993); date_ (m, d, y), person_ (n) {} july_4th.print (cout); // july 4, 1993 // same as before Birthday igors_birthday (Igor Stravinsky, 6, 17, 1882); private: igors_birthday.print (cout); Date date_; // Igor Stravinsky was born on june 17, 1882 std::string person_; }; Date *dp = igors_birthday; dp-print (cout); // what gets printed ?!?! // (*dp-vptr[1])(dp, cout); Copyright c 1997-2006 Vanderbilt University 22 Copyright c 1997-2006 Vanderbilt University 23
  • 7. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Alternatives to Specialization, (cont’d) Another View of Inheritance However, in this case we would not be able to utilize the dynamic Inheritance can also be viewed as a way to construct a hierarchy of binding facilities for base classes derived classes, e.g., types that are “incomplete” except for the leaves of the hierarchy Date *dp = igors_birthday; – e.g., you may wish to represent animals with an inheritance // ERROR, Birthday is not a subclass of date! hierarchy. Lets call the root class of this hierarchy “Animal” – Two classes derive from Animal: Vertebrate and Invertebrate While this does not necessarily affect reusability, it does affect – Vertebrate can be derived to Mammal, Reptile, Bird, Fish, etc.. extensibility . . . – Mammals can be derived into Rodents, Primates, Pachyderms, etc.. – Primates can be derived into Apes, Sloths, Humans, etc.. – Humans can be derived into Males Females We can then declare objects to represent specific males females, e.g., Bob, Ted, Carol, Alice Copyright c 1997-2006 Vanderbilt University 24 Copyright c 1997-2006 Vanderbilt University 25 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Another View of Inheritance Using Inheritance for Extension/Generalization Animal Derived classes add state variables and/or operations to the Advantages properties and operations associated with the base class Vertebrate Invertebrate – Share code – Note, the interface is generally widened! set-up dynamic – Data member method access privileges may also be modified Reptile Mammal Bird Fish binding Extension/generalization is often used to faciliate reuse of Rodents Primates Pachyderms – Model classify implementations, rather than interface external objects Apes Humans Sloths – However, it is not always necessary or correct to export interfaces with design from a base class to derived classes Males Females implementation Bob Carol Ted Alice Copyright c 1997-2006 Vanderbilt University 26 Copyright c 1997-2006 Vanderbilt University 27
  • 8. OO Progr Douglas C. Schmidt OO Programming with C++ Often, a better approach in this case is to use a Extension/Generalization Example, Extension/Generalization Example RELATIONSHIP DESCENDANT Vector Using class Vector as a private base class for derived class Ada Vanderbilt University Stack: Checked – class Stack : private Vector { /* . . . */ }; Vector descendant/Is-A relationship . . . composition/Has-A rather than a Vector In this case, Vector’s operator[] may be reused as an (cont’d) implementation for the Stack push pop methods – Note that using private inheritance ensures that operator[] RELATIONSHIP does not appear in class Stack’s interface! Vector CONSUMER Copyright c 1997-2006 Douglas C. Schmidt Stack Copyright c 1997-2006 Vanderbilt University 28 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Vector Interface Vector Implementation Using class Vector as a base class for a derived class such as template class T class Checked Vector or class Ada Vector VectorT::Vector (size_t s): size_ (s), buf_ (new T[s]) /* Bare-bones Vector implementation, fast but not safe: {} the array of elements is uninitialized, ranges are not checked. Also, assignment is not supported. */ template class T template class T class Vector { VectorT::˜Vector (void) { delete [] this-buf_; } public: Vector (size_t s); template class T size_t ˜Vector (void); VectorT::size (void) const { return this-size_; } size_t size (void) const; T operator[] (size_t index); template class T T private: VectorT::operator[] (size_t i) T *buf_; { size_t size_; return this-buf_[i]; }; } Copyright c 1997-2006 Vanderbilt University 30 Copyright c 1997-2006 Vanderbilt University 31
  • 9. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Vector Use-case Benefits of Inheritance int Inheritance enables modification and/or extension of ADTs without main (int, char *[]) { changing the original source code Vectorint v (10); – e.g., someone may want a variation on the basic Vector abstraction: v[6] = v[5] + 4; // oops, no initial values 1. A vector whose bounds are checked on every reference 2. Allow vectors to have lower bounds other than 0 int i = v[v.size ()]; // oops, out of range! 3. Other vector variants are possible too . . . e.g., automatically-resizing vectors, initialized vectors, etc. // destructor automatically called } This is done by defining new derived classes that inherit the characteristics of the Vector base class – Note that inheritance also allows code to be shared Copyright c 1997-2006 Vanderbilt University 32 Copyright c 1997-2006 Vanderbilt University 33 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Checked Vector Interface Implementation of Checked Vector The following allows run-time range checking: template class T int /* File Checked-Vector.h (incomplete wrt Checked_VectorT::in_range (size_t i) const { initialization assignment) */ return i this-size (); } struct Range_Error { Range_Error (size_t index); /* ... */ }; template class T template class T Checked_VectorT::Checked_Vector (size_t s) class Checked_Vector : public VectorT { : inherited (s) {} public: Checked_Vector (size_t s); T operator[] (size_t i) throw (Range_Error); template class T T // Vector::size () inherited from base class Vector. Checked_VectorT::operator[] (size_t i) protected: throw (Range_Error) { int in_range (size_t i) const; if (this-in_range (i)) private: return (*(inherited *) this)[i]; typedef VectorT inherited; // equivalent to: return inherited::operator[](i); }; else throw Range_Error (i); } Copyright c 1997-2006 Vanderbilt University 34 Copyright c 1997-2006 Vanderbilt University 35
  • 10. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Checked Vector Use-case Describing Relationships Between Classes #include Checked_Vector.h Consumer/Composition/Aggregation typedef Checked_Vectorint CV_int; – A class is a consumer of another class when it makes use of the int foo (int size) other class’s services, as defined in its interface { For example, our Bounded Stack implementation relies on try Array for its implementation, thus is consumer of the Array { class CV_int cv (size); – Consumers are used to describe a Has-A relationship int i = cv[cv.size ()]; // Error detected! // exception raised . . . Descendant/Inheritance/Specialization // Call base class destructor – A class is a descendant of one or more other classes when it is } designed as an extension or specialization of these classes. This catch (Range_Error) is the notion of inheritance { /* . . . */ } – Descendants are used to describe an Is-A relationship } Copyright c 1997-2006 Vanderbilt University 36 Copyright c 1997-2006 Vanderbilt University 37 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Interface vs. Implementation Inheritance The Dangers of Implementation Inheritance Using inheritance for reuse may sometimes be a dangerous misuse Class inheritance can be used in two primary ways: of the technique 1. Interface inheritance: a method of creating a subtype of an – Operations that are valid for the base type may not apply to the existing class for purposes of setting up dynamic binding, e.g., derived type at all – Circle is a subclass of Shape (i.e., Is-A relation) e.g., performing an subscript operation on a stack is a – A Birthday is a subclass of Date meaningless potentially harmful operation 2. Implementation inheritance: a method of reusing an class Stack : public Vector { /* . . . */ }; implementation to create a new class type Stack s; – e.g., a class Stack that inherits from class Vector. A Stack is not s[10] = 20; // could be big trouble! really a subtype or specialization of Vector – In C++, the use of a private base class minimizes the dangers – In this case, inheritance makes implementation easier, because i.e., if a class is derived “private,” it is illegal to assign the there is no need to rewrite debug existing code. address of a derived object to a pointer to a base object – This is called using inheritance for reuse – On the other hand, a consumer/Has-A relation might be more – i.e., a pseudo-Has-A relation appropriate . . . Copyright c 1997-2006 Vanderbilt University 38 Copyright c 1997-2006 Vanderbilt University 39
  • 11. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Private vs Public vs Protected Derivation Public Derivation Access control specifiers (i.e., public, private, protected) are also class A { class B : public A { meaningful in the context of inheritance public: public: public A [public A] In the following examples: protected: public B – . . . . represents actual (omitted) code protected A protected: – [. . . .] is implicit private: [protected A] private A protected B Note, all the examples work for both data members methods }; private: private B }; Copyright c 1997-2006 Vanderbilt University 40 Copyright c 1997-2006 Vanderbilt University 41 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Protected Derivation Private Derivation class A { class B : protected A { class A { class B : private A { public: public: public: // same as class B : A public A public B public A public: protected: protected: private: public B protected A [protected A] private A protected: private: [public A] protected: protected B private A protected B protected A private: }; private: }; [public A] private B [protected A] }; private B }; Copyright c 1997-2006 Vanderbilt University 42 Copyright c 1997-2006 Vanderbilt University 43
  • 12. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Derived Class Access to Base Class Members Other Uses of Access Control Specifiers Base Class Inheritance mode Selectively redefine visibility of individual methods inherited from Access Control public protected private base classes. NOTE: the redifinition can only be to the visibility of public public protected private the base class. Selective redefinition can only override the protected protected protected private additional control imposed by inheritance. private none none none class A { class B : private A { public: public: The vertical axis represents the access rights specified in the base int f (void); A::f; // Make public class int g_; protected: The horizontal access represents the mode of inheritance used by . . . A::g_; // Make protected the derived class private: }; int p_; Note that the resulting access is always the most restrictive of the }; two Copyright c 1997-2006 Vanderbilt University 44 Copyright c 1997-2006 Vanderbilt University 45 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Common Issues with Access Control Specifiers General Rules for Access Control Specifiers It is an error to increase the access of an inherited method above Private methods of the base class are not accessible to a derived the level given in the base class class (unless the derived class is a friend of the base class) Deriving publicly then selectively decreasing the visibility of base If the subclass is derived publicly then: class methods in the derived class should be used with caution: 1. Public methods of the base class are accessible to the derived removes methods from the public interface at lower scopes in the class inheritance hierarchy. 2. Protected methods of the base class are accessible to derived classes friends only // Error if p_ is class B : public A { // protected in A! private: class B : private A { A::f; // hides A::f public: }; A::p_; }; Copyright c 1997-2006 Vanderbilt University 46 Copyright c 1997-2006 Vanderbilt University 47
  • 13. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Caveats Caveats, example class Vector { Using protected methods weakens the data hiding mechanism public: because changes to the base class implementation might affect all // . . . derived classes. protected: However, performance design reasons may dictate use of the // allow derived classes direct access protected access control specifier T *buf_; size_t size_; – Note, inlining functions often reduces the need for these efficiency }; hacks. class Ada_Vector : public Vector { public: T operator() (size_t i) { return this-buf_[i]; } // Note the strong dependency on the buf_ }; Copyright c 1997-2006 Vanderbilt University 48 Copyright c 1997-2006 Vanderbilt University 49 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Overview of Multiple Inheritance in C++ Liabilities of Multiple Inheritance C++ allows multiple inheritance A base class may legally appear only once in a derivation list, e.g., – i.e., a class can be simultaneously derived from two or more base class Two_Vect : public Vect, public Vect // ERROR! classes, e.g., However, a base class may appear multiple times within a derivation class X { /* . . . */ }; hierarchy class Y : public X { /* . . . */ }; class Z : public X { /* . . . */ }; – e.g., class YZ contains two instances of class X class YZ : public Y, public Z { /* . . . */ }; – Derived classes Y, Z, YZ inherit the data members methods This leads to two problems with multiple inheritance: from their respective base classes 1. It gives rise to a form of method data member ambiguity – Explicitly qualified names additional methods are used to resolve this 2. It also may cause unnecessary duplication of storage – Virtual base classes are used to resolve this Copyright c 1997-2006 Vanderbilt University 50 Copyright c 1997-2006 Vanderbilt University 51
  • 14. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Motivation for Virtual Base Classes Overview of Virtual Base Classes Consider a user who wants an Init_Checked_Vector: Virtual base classes allow class designers to specify that a base class will be shared among derived classes class Checked_Vector : public virtual Vector { /* . . . */ }; – No matter how often a virtual base class may occur in a derivation class Init_Vector : public virtual Vector hierarchy, only one shared instance is generated when an object { /* . . . */ }; is instantiated class Init_Checked_Vector : Under the hood, pointers are used in derived classes that public Checked_Vector, public Init_Vector contain virtual base classes { /* . . . */ }; Understanding using virtual base classes correctly is a non-trivial In this example, the virtual keyword, when applied to a base class, task because you must plan in advance causes Init_Checked_Vector to get one Vector base class – Also, you must be aware when initializing subclasses objects . . . instead of two However, virtual base classes are used to implement the client server side of many implementations of CORBA distributed objects Copyright c 1997-2006 Vanderbilt University 52 Copyright c 1997-2006 Vanderbilt University 53 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Virtual Base Classes Illustrated Initializing Virtual Base Classes With C++ you must chose one of two methods to make constructors Vector work correctly for virtual base classes: NON-VIRTUAL Vector INHERITANCE 1. You need to either supply a constructor in a virtual base class that takes no arguments (or has default arguments), e.g., Checked Init Checked Vector::Vector (size_t size = 100); // not clean! Vector Checked Vector Vector 2. Or, you must make sure the most derived class calls the constructor for the virtual base class in its base initialization Vector section, e.g., v v Init_Checked_Vector (size_t size, const T init): VIRTUAL INHERITANCE Vector (size), Check_Vector (size), Checked Init Checked Init_Vector (size, init) Vector Vector Checked Vector Copyright c 1997-2006 Vanderbilt University 54 Copyright c 1997-2006 Vanderbilt University 55
  • 15. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Virtual Base Class Initialization Example Virtual Base Class Initialization Example, (cont’d) #include iostream.h class Derived : public Derived1, public Derived2 { class Base { public: public: // The Derived constructor _must_ call the Base Base (int i) { cout Base::Base ( i ) endl; } // constructor explicitly, because Base doesn’t }; // have a default constructor. class Derived1 : public virtual Base { Derived (void) : Base (3) { public: cout Derived (void) endl; Derived1 (void) : Base (1) { cout Derived1 (void) endl; } } }; }; class Derived2 : public virtual Base { public: Derived2 (void) : Base (2) { cout Derived2 (void) endl; } }; Copyright c 1997-2006 Vanderbilt University 56 Copyright c 1997-2006 Vanderbilt University 57 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Virtual Base Class Initialization Example, (cont’d) Vector Interface Revised int The following example illustrates templates, multiple inheritance, main (int, char *[]) and virtual base classes in C++: { #include iostream.h Base b (0); // Direct instantiation of Base: // A simple-minded Vector base class, // Base::Base (0) // no range checking, no initialization. Derived1 d1; // Instantiates Base via Derived1 ctor: template class T class Vector // Base::Base (1) { Derived2 d2; // Instantiates Base via Derived2 ctor: public: // Base::Base (2) Vector (size_t s): size_ (s), buf_ (new T[s]) {} Derived d; // Instantiates Base via Derived ctor: T operator[] (size_t i) { return this-buf_[i]; } // Base::Base (3) size_t size (void) const { return this-size_; } return 0; private: } size_t size_; T *buf_; }; Copyright c 1997-2006 Vanderbilt University 58 Copyright c 1997-2006 Vanderbilt University 59
  • 16. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Init Vector Interface Checked Vector Interface A simple extension to the Vector base class, that enables Extend Vector to provide checked subscripting automagical vector initialization template class T template class T class Checked_Vector : public virtual VectorT { class Init_Vector : public virtual VectorT public: { Checked_Vector (size_t size): VectorT (size) {} public: T operator[] (size_t i) throw (Range_Error) { Init_Vector (size_t size, const T init) if (this-in_range (i)) return (*(inherited *) this) : VectorT (size) else throw Range_Error (i); { } for (size_t i = 0; i this-size (); i++) // Inherits inherited::size. (*this)[i] = init; private: } typedef VectorT inherited; // Inherits subscripting operator size(). int in_range (size_t i) const }; { return i this-size (); } }; Copyright c 1997-2006 Vanderbilt University 60 Copyright c 1997-2006 Vanderbilt University 61 Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Init Checked Vector Interface Init Checked Vector Driver int main (int argc, char *argv[]) { A simple multiple inheritance example that provides for both an try { initialized and range checked Vector size_t size = ::atoi (argv[1]); template class T size_t init = ::atoi (argv[2]); class Init_Checked_Vector : Init_Checked_Vectorint v (size, init); public Checked_VectorT, public Init_VectorT { cout vector size = v.size () public: , vector contents = ; Init_Checked_Vector (size_t size, const T init): VectorT (size), for (size_t i = 0; i v.size (); i++) Init_VectorT (size, init), cout v[i]; Checked_VectorT (size) {} // Inherits Checked_Vector::operator[] cout n ++v[v.size () - 1] n; }; } catch (Range_Error) { /* . . . */ } } Copyright c 1997-2006 Vanderbilt University 62 Copyright c 1997-2006 Vanderbilt University 63
  • 17. Douglas C. Schmidt OO Programming with C++ Douglas C. Schmidt OO Programming with C++ Multiple Inheritance Ambiguity Multiple Inheritance Ambiguity, (cont’d) Consider the following: There are two ways to fix this problem: struct Base_1 { int foo (void); /* . . . */ }; 1. Explicitly qualify the call, by prefixing it with the name of the struct Base_2 { int foo (void); /* . . . */ }; intended base class using the scope resolution operator, e.g., struct Derived : Base_1, Base_2 { /* . . . */ }; d.Base_1::foo (); // or d.Base_2::foo () int main (int, char *[]) { 2. Add a new method foo to class Derived (similar to Eiffel’s Derived d; renaming concept) e.g., d.foo (); // Error, ambiguous call to foo () struct Derived : Base_1, Base_2 { } int foo (void) { Base_1::foo (); // either, both Base_2::foo (); // or neither } }; Copyright c 1997-2006 Vanderbilt University 64 Copyright c 1997-2006 Vanderbilt University 65 Douglas C. Schmidt OO Programming with C++ Summary Inheritance supports evolutionary, incremental development of reusable components by specializing and/or extending a general interface/implementation Inheritance adds a new dimension to data abstraction, e.g., – Classes (ADTs) support the expression of commonality where the general aspects of an application are encapsulated in a few base classes – Inheritance supports the development of the application by extension and specialization without affecting existing code . . . Without browser support, navigating through complex inheritance hierarchies is difficult . . . tools can help. Copyright c 1997-2006 Vanderbilt University 66