0% found this document useful (0 votes)
47 views42 pages

OOP3

Uploaded by

tazmaws
Copyright
© © All Rights Reserved
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
0% found this document useful (0 votes)
47 views42 pages

OOP3

Uploaded by

tazmaws
Copyright
© © All Rights Reserved
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);
}

void grad_student::print()
{
student::print();
cout << dept << ", " << thesis << endl;
}
16
Use
int main()
{
student s1("Jane Doe", 100, 1);
grad_student gs1("John Smith", 200, 4,
"Pharmacy", "Retail Thesis");

cout << "Student classes example:\n";

cout << "\n Student s1:";
s1.print();
cout << Year << s1.year_group()
<< endl;
:
continued
17
cout << "\n Grad student gs1:";
gs1.print();
cout << Year << gs1.year_group()
<< endl;
:
18
Using Pointers
student *ps;
grad_student *pgs;

ps = &s1;
cout << "\n ps, pointing to s1:";
ps->print();

ps = &gs1;
cout << "\n ps, pointing to gs1:";
ps->print();

pgs = &gs1;
cout << "\n pgs, pointing to gs1:";
pgs->print();

return 0;
}
19
Output
$ g++ -Wall -o gstudent gstudent.cc

$ gstudent
Student classes example:

Student s1:
Jane Doe, 100, 1
Year 1

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()

return 0;
}
31
Output
$ g++ -Wall -o virtual virtual.cc

$ 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

no automatic garbage collection

You might also like