C++-Inherit.Pdf

C++-Inherit.Pdf

The C++ Programming Language Single and Multiple Inheritance in C++ Douglas C. Schmidt www.cs.wustl.edu/schmidt/ [email protected] Washington University, St. Louis 1 Background Object-oriented programming is often de- ned as the combination of Abstract Data Typ es ADTs with Inheritance and Dy- namic Binding Each concept addresses a di erent asp ect of system decomp osition: 1. ADTs decomp ose systems into two-dimensional grids of mo dules { Each mo dule has public and private inter- faces 2. Inheritance decomp oses systems into three-dimensional hierarchies of mo dules { 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! 2 Data Abstraction vs. Inheritance DATA ABSTRACTION (2 DIMENTIONAL) (2 DIMENTIONAL) INHERITANCE (3 DIMENTIONAL) 3 Motivation for Inheritance Inheritance allows you to write co de to handle certain cases and allows other de- velop ers to write co de that handles more sp ecialized cases, while your co de contin- ues to work Inheritance partitions a system architec- ture into semi-disjoint comp onents that are related hierarchically Therefore, we may be able to mo dify and/or reuse sections of the inheritance hierarchy without disturbing existing co de, e.g., { Change sibling subtree interfaces i.e., a consequence of inheritance { Change implementation of ancestors i.e., a consequence of data abstraction 4 Inheritance Overview A typ e called a sub class or derived typ e can inherit the characteristics of another typ es called a sup erclass or base typ e { The term sub class is equivalent to derived typ e A derived typ e acts just like the base typ e, except for an explicit list of: 1. Sp ecializations { Change implementations without changing the base class interface Most useful when combined with dynamic binding 2. Generalizations/Extensions { Add new op erations or data to derived classes 5 Visualizing Inheritance Base Derived 2 Derived 1 Derived 5 Derived Derived 4 3 Derived 6 6 Typ es of Inheritance Inheritance comes in two forms, dep end- ing on numb er of parents a sub class has 1. Single Inheritance SI { Only one parent per derived class { Form an inheritance \tree" { SI requires a small amount of run-time over- head when used with dynamic binding { e.g., Smalltalk, Simula, Object Pascal 2. Multiple Inheritance MI { More than one parent per derived class { Forms an inheritance \Directed Acyclic Graph" DAG { Compared with SI, MI adds additional run- time overhead also involving dynamic bind- ing { e.g., C++, Ei el, Flavors a LISP dialect 7 Inheritance Trees vs. Inheritance DAGs Base Derived Derived 1 2 INHERITANCE Derived Derived TREE 4 3 Base Base 1 Derived 2 1 INHERITANCE Derived Derived 3 DAG 4 8 Inheritance Bene ts 1. Increase reuse and software quality Programmers reuse the base classes instead of writing new classes { Integrates black-b ox and white-b ox reuse by allowing extensibility and mo di cation with- out changing existing co de Using well-tested base classes helps reduce bugs in applications that use them Reduce object co de size 2. Enhance extensibility and comprehensibil- ity Helps supp ort more exible and extensible ar- chitectures along with dynamic binding { i.e., supp orts the op en/closed principle Often useful for mo deling and classifying hierarchically- related domains 9 Inheritance Liabilities 1. May create deep and/or wide hierarchies that are hard to understand and navigate without class browser to ols 2. May decrease p erformance slightly i.e., when combined with multiple inheritance and dynamic binding 3. Without dynamic binding, inheritance has only limited utility Likewise, dynamic binding is almost totally use- less without inheritance 4. Brittle hierarchies, which may imp ose de- p endencies up on ancestor names 10 Inheritance in C++ Deriving a class involves an extension to the C++ class declaration syntax The class head is mo di ed to allow a deriva- tion list consisting of base classes e.g., class Foo f /* :::g; class Bar : public Foo f /* :::g; class Foo : public Foo, public Bar f /* :::g; 11 Key Prop erties of C++ Inheritance The base/derived class relationship is ex- plicitly recognized in C++ by prede ned standard conversions { i.e., a p ointer to a derived class may always be assigned to a p ointer to a base class that was inherited publically But not vice versa::: When combined with dynamic binding, this sp ecial relationship between inherited class typ es promotes a typ e-secure, p olymor- phic style of programming { i.e., the programmer need not know the actual typ e of a class at compile-time { Note, C++ is not truly p olymorphic i.e., op erations are not applicable to objects that don't contain de nitions of these op- erations at some p oint in their inheritance hierarchy 12 Simple Screen Class The following co de is used as the base class: class Screen f public: Screen int = 8, int = 40, char = ' '; ~Screen void; ; g short height void const f return this->height short width void const f return this->width ; g void height short h f this->height = h; g void width short w f this->width = w; g Screen &forward void; Screen &up void; Screen &down void; Screen &home void; Screen &b ottom void; Screen &display void; Screen &copy const Screen &; // ::: private: short height , width ; char *screen , *cur pos ; g; 13 Sub classing from Screen class Screen can be a public base class of class Window e.g., class Window : public Screen f public: Window const Point &, int rows = 24, int columns = 80, char default char = ' '; void set foreground color Color &; void set background color Color &; void resize int height, int width; // ::: private: Point center ; ; Color foreground Color background ; // ::: g; 14 Multiple Levels of Derivation A derived class can itself form the basis for further derivation, e.g., class Menu : public Window f public: lab el const char *l; void set Menu const Point &, int rows = 24, int columns = 80, char default char = ' '; // ::: private: char *lab el ; // ::: g; class Menu inherits data and metho ds from b oth Window and Screen { i.e., sizeof Menu >= sizeof Window >= sizeof Screen 15 The Screen Inheritance Hierarchy Point Screen Color Window Menu Screen/Window/Menu hierarchy 16 Variations on a Screen: : : ps1 : ps2 : Screen Screen w : Window Menu A p ointer to a derived class can be as- signed to a p ointer to any of its public base classes without requiring an explicit cast: Menu m; Window &w = m; Screen *ps1 = &w; Screen *ps2 = &m; 17 Using the Screen Hierarchy e.g., class Screen f public: virtual void dump ostream &; = 0 g class Window : public Screen f public: virtual void dump ostream &; g; class Menu : public Window f public: virtual void dump ostream &; g; // stand-alone function void dump image Screen *s, ostream &o f // Some pro cessing omitted s->dump o; // *s->vptr[1] s, o; g Screen s; Window w; Menu m; Bit Vector bv; // OK: Window is a kind of Screen image &w, cout; dump // OK: Menu is a kind of Screen dump image &m, cout; // OK: argument typ es match exactly dump image &s, cout; // Error: Bit Vector is not a kind of Screen! dump image &bv, cout; 18 Using Inheritance for Sp ecialization A derived class sp ecializes a base class by adding new, more sp eci c state variables and metho ds { Metho d use the same interface, even though they are implemented di erently i.e., \overridden" { Note, there is an imp ortant distinction between overriding, hiding, and overloading::: A variant of this is used in the template metho d pattern { i.e., b ehavior of the base class relies on func- tionality supplied by the derived class { This is directly supp orted in C++ via abstract base classes and pure virtual functions 19 Sp ecialization Example Inheritance may be used to obtain the fea- tures of one data typ e in another closely related data typ e For example, class Date represents an ar- bitrary Date: class Date f public: Date int m, int d, int y; virtual void print ostream &s const; // ::: private: int month , day , year ; g; Class Birthday derives from Date, adding a name eld representing the p erson's birth- day, e.g., class Birthday : public Date f public: Birthday const char *n, int m, int d, int y : Date m, d, y, p erson strdup n fg ~Birthday void f free p erson ; g virtual void print ostream &s const; // ::: private: ; const char *p erson g; 20 Implementation and Use-case Birthday::print could print the p erson's name as well as the date, e.g., void Birthday::print ostream &s const f << " was born on "; s << this->p erson Date::print s; s << "\n"; g e.g., const Date july 4th 7, 4, 1993; Birthday my birthday "Douglas C. Schmidt", 7, 18, 1962; july 4th.print cerr; // july 4th, 1993 my birthday.print cout; // Douglas C. Schmidt was born on july 18th, 1962 birthday; Date *dp = &my dp->print cerr; // ??? what gets printed ??? // *dp->vptr[1]dp, cerr; 21 Alternatives to Sp ecialization Note that we could also use object com- p osition instead of inheritance for this ex- ample, e.g., class Birthday f public Birthday char *n, int m, int d, int y: m, d, y, p erson n fg date // same as b efore private: Date date ; char *p erson ; g; However, in this case we would not be able to utilize the dynamic binding facilities for base classes and derived classes { e.g., Date *dp = &my birthday; // ERROR, Birthday is not a sub class of date! { While this do es not necessarily a ect reusabil- ity, it do es a ect extensibility::: 22 Using Inheritance for Extension/Generalization Derived

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    64 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us