We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 42
1
Inheritance and Polymorphism
Andrew Davison Noppadon Kamolvilassatian
Department of Computer Engineering Prince of Songkla University 2 Contents 1. Key OOP Features 2. Inheritance Concepts 3. Inheritance Examples 4. Implementing Inheritance in C++ 5. Polymorphism 6. Inclusion (Dynamic Binding) 7. Virtual Function Examples 8. C++ Pros and Cons 3 1. Key OOP Features ADTs (done in the last section)
Inheritance
Polymorphism 4 2. Inheritance Concepts Derive a new class (subclass) from an existing class (base class or superclass).
Inheritance creates a hierarchy of related classes (types) which share code and interface. 5 3. Inheritance Examples Base Class Derived Classes Student CommuterStudent ResidentStudent Shape Circle Triangle Rectangle Loan CarLoan HomeImprovementLoan MortgageLoan 6 More Examples Base Class Derived Classes Employee Manager Researcher Worker Account CheckingAccount SavingAccount 7 University community members Employee CommunityMember Student Faculty Staff Administrator Teacher 8 Shape class hierarchy TwoDimensionalShape Shape ThreeDimensionalShape Circle Square Triangle Sphere Cube Tetrahedron 9 Credit cards logo american express hologram card owners name inherits from (isa) visa card master card pin category 10 4. Implementing Inheritance in C++ Develop a base class called student
Use it to define a derived class called grad_student 11 The Student Class Hierarchy student print() year_group() grad_student print() inherits (isa) student_id, year, name dept, thesis 12 Student Class class student { public: student(char* nm, int id, int y); void print(); int year_group() { return year; } private: int student_id; int year; char name[30]; }; 13 Member functions student::student(char* nm, int id, int y) { student_id = id; year = y; strcpy(name, nm); }
void student::print() { cout << "\n" << name << ", " << student_id << ", " << year << endl; } 14 Graduate Student Class class grad_student: public student { public: grad_student(char* nm, int id, int y, char* d, char* th); void print(); private: char dept[10]; char thesis[80]; }; 15 Member functions grad_student::grad_student(char* nm, int id, int y, char* d, char* th) :student(nm, id, y) { strcpy(dept, d); strcpy(thesis, th); }
Grad student gs1: John Smith, 200, 4 Pharmacy, Retail Thesis Year 4 :
continued 20 ps, pointing to s1: Jane Doe, 100, 1
ps, pointing to gs1: John Smith, 200, 4
pgs, pointing to gs1: John Smith, 200, 4 Pharmacy, Retail Thesis
$
student print() used. grad_student print() used. 21 Notes The choice of print() depends on the pointer type, not the object pointed to.
This is a compile time decision (called static binding). 22 5. Polymorphism Webster: "Capable of assuming various forms."
Four main kinds:
1. coercion a / b
2. overloading a + b continued 23 3. inclusion (dynamic binding) Dynamic binding of a function call to a function.
4. parametric The type argument is left unspecified and is later instantiated e.g generics, templates 24 6. Inclusion (dynamic binding) 5.1. Dynamic Binding in OOP 5.2. Virtual Function Example 5.3. Representing Shapes 5.4. Dynamic Binding Reviewed 25 Dynamic Binding in OOP X print() Classes Y print() Z print() inherits (isa) X x; Y y; Z z; X *px;
px = & ??; // can be x,y,or z
px->print(); // ?? 26 Two Types of Binding Static Binding (the default in C++) px->print() uses Xs print this is known at compile time
Dynamic Binding px->print() uses the print() in the object pointed at this is only known at run time coded in C++ with virtual functions 27 Why only known at run time? Assume dynamic binding is being used:
X x; Y y; Z z; X *px; : cin >> val; if (val == 1) px = &x; else px = &y; px->print(); // which print() is used?
28 7. Virtual Function Examples class B { public: int i; virtual void print() { cout << "i value is " << i << " inside object of type B\n\n"; } };
class D: public B { public: void print() { cout << "i value is " << i << " inside object of type D\n\n"; } }; 29 Use int main() { B b; B *pb; D d;
// initilise i values in objects b.i = 3; d.i = 5; : 30 pb = &b; cout << "pb now points to b\n"; cout << "Calling pb->print()\n"; pb->print(); // uses B::print()
pb = &d; cout << "pb now points to d\n"; cout << "Calling pb->print()\n"; pb->print(); // uses D::print()
$ virtual pb now points to b Calling pb->print() i value is 3 inside object of type B
pb now points to d Calling pb->print() i value is 5 inside object of type D
$
32 7.1 Representing Shapes shape rectangle square triangle circle
inherits (isa) 33 C++ Shape Classes class shape { public: virtual double area() = 0; };
class rectangle: public shape { public: double area() const {return (height*width);} : private: double height, width; }; 34 class circle: public shape { public: double area() const {return (PI*radius*radius);} : private: double radius; };
// etc 35 Use: shape* p[N]; circle c1,...; rectangle r1,...; : // fill in p with pointers to // circles, squares, etc p[0] = &c1; p[1] = &r1; ... : : // calculate total area for (i = 0; i < N; ++i) tot_area = tot_area + p[i]->area(); 36 Coding shape in C enum shapekinds {CIRCLE, RECT, ...};
struct shape { enum shapekinds s_val; double centre, radius, height, ...; : /* data for all shapes must go here */ };
continued 37 double area(shape *s) { switch (s->s_val) { case CIRCLE: return (PI*s->radius*s->radius); case RECT: return (s->height*s->width); : /* area code for all shapes must go here */ }
add a new kind of shape? 38 Dynamic Binding Reviewed Advantages: Extensions of the inheritance hierarchy leaves the clients code unaltered. Code is localised each class is responsible for the meaning of its functions (e.g. print()).
Disadvantage: (Small) run-time overhead. 39 8. C++ Pros and Cons 6.1. Reasons for using C++
6.2. Reasons for not using C++ 40 8.1 Reasons for using C++ bandwagon effect
C++ is a superset of C familiarity installed base can be kept can pretend to code in C++
efficient implementation continued 41 low-level and high-level features
portable
a better C
no need for fancy OOP resources 42 8.2 Reasons for not using C++ a hybrid
size
confusing syntax and semantics
programmers must decide between efficiency and elegance