l10
DESCRIPTION
nthTRANSCRIPT
![Page 1: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/1.jpg)
1
Inheritance and Polymorphism
Andrew Davison
Noppadon Kamolvilassatian
Department of Computer Engineering
Prince of Songkla University
![Page 2: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/2.jpg)
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
![Page 3: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/3.jpg)
3
1. Key OOP Features
ADTs (done in the last
section)
Inheritance
Polymorphism
![Page 4: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/4.jpg)
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.
![Page 5: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/5.jpg)
5
3. Inheritance Examples
Base Class Derived Classes
Student CommuterStudent
ResidentStudent
Shape Circle
Triangle
Rectangle
Loan CarLoan
HomeImprovementLoan
MortgageLoan
![Page 6: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/6.jpg)
6
More Examples
Base Class Derived Classes
Employee Manager
Researcher
Worker
Account CheckingAccount
SavingAccount
![Page 7: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/7.jpg)
7
University community members
Employee
CommunityMember
Student
Faculty Staff
Administrator Teacher
![Page 8: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/8.jpg)
8
Shape class hierarchy
TwoDimensionalShape
Shape
ThreeDimensionalShape
Circle Square Triangle Sphere Cube Tetrahedron
![Page 9: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/9.jpg)
9
Credit cards
logo
american
express
hologram
card
owner’s name
inherits
from (isa)
visa
card
master
card
pin category
![Page 10: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/10.jpg)
10
4. Implementing Inheritance in C++
Develop a base class called student
Use it to define a derived class called grad_student
![Page 11: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/11.jpg)
11
The Student Class Hierarchy
student print()
year_group()
grad_student
print()
inherits (isa)
student_id,
year, name
dept,
thesis
![Page 12: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/12.jpg)
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];
};
![Page 13: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/13.jpg)
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;
}
![Page 14: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/14.jpg)
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];
};
![Page 15: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/15.jpg)
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;
}
![Page 16: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/16.jpg)
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
![Page 17: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/17.jpg)
17
cout << "\n Grad student gs1:";
gs1.print();
cout << “Year “ << gs1.year_group()
<< endl;
:
![Page 18: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/18.jpg)
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;
}
![Page 19: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/19.jpg)
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
![Page 20: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/20.jpg)
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.
![Page 21: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/21.jpg)
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).
![Page 22: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/22.jpg)
22
5. Polymorphism
Webster: "Capable of assuming various forms."
Four main kinds:
1. coercion
a / b
2. overloading
a + b
continued
![Page 23: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/23.jpg)
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
![Page 24: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/24.jpg)
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
![Page 25: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/25.jpg)
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(); // ??
![Page 26: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/26.jpg)
26
Two Types of Binding
Static Binding (the default in C++)
– px->print() uses X’s 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
![Page 27: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/27.jpg)
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?
![Page 28: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/28.jpg)
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"; }
};
![Page 29: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/29.jpg)
29
Use
int main()
{
B b;
B *pb;
D d;
// initilise i values in objects
b.i = 3;
d.i = 5;
:
![Page 30: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/30.jpg)
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;
}
![Page 31: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/31.jpg)
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
$
![Page 32: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/32.jpg)
32
7.1 Representing Shapes
shape
rectangle
square
triangle circle • • • •
inherits (isa)
![Page 33: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/33.jpg)
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;
};
![Page 34: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/34.jpg)
34
class circle: public shape {
public:
double area() const
{return (PI*radius*radius);}
:
private:
double radius;
};
// etc
![Page 35: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/35.jpg)
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();
![Page 36: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/36.jpg)
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
![Page 37: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/37.jpg)
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?
![Page 38: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/38.jpg)
38
Dynamic Binding Reviewed
Advantages:
– Extensions of the inheritance hierarchy leaves the
client’s code unaltered.
– Code is localised – each class is responsible for the
meaning of its functions (e.g. print()).
Disadvantage:
– (Small) run-time overhead.
![Page 39: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/39.jpg)
39
8. C++ Pros and Cons
6.1. Reasons for using C++
6.2. Reasons for not using C++
![Page 40: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/40.jpg)
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
![Page 41: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/41.jpg)
41
low-level and high-level features
portable
a better C
no need for fancy OOP resources
![Page 42: L10](https://reader033.vdocument.in/reader033/viewer/2022060119/558fc41b1a28ab92318b45e8/html5/thumbnails/42.jpg)
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