Inheritance,%20Polymorphism,%20and%20Virtual%20Functions - PowerPoint PPT Presentation

About This Presentation
Title:

Inheritance,%20Polymorphism,%20and%20Virtual%20Functions

Description:

Provides a way to create a new class from an existing class ... Grasshopper Class. Base Class (Parent) Derived Class (Child) Inheritance & Polymorphism ... – PowerPoint PPT presentation

Number of Views:69
Avg rating:3.0/5.0
Slides: 80
Provided by: tony251
Category:

less

Transcript and Presenter's Notes

Title: Inheritance,%20Polymorphism,%20and%20Virtual%20Functions


1
Inheritance, Polymorphism, and Virtual Functions
2
What Is Inheritance?
  • Provides a way to create a new class from an
    existing class
  • The new class is a specialized version of the
    existing class
  • It inherits all the member variables and
    functions (except the constructors and
    destructor) of the class it is based on

3
Example Insects
4
The "is a" Relationship
  • Inheritance establishes an "is a" relationship
    between classes.
  • A poodle is a dog
  • A car is a vehicle
  • A flower is a plant
  • A football player is an athlete
  • A savings account is a type of bank account

5
Inheritance Terminology and Notation
  • Base class (or parent) inherited from
  • Derived class (or child) inherits from the base
    class
  • Notation
  • class Student // base class
  • . . .
  • class UnderGrad public student
  • // derived class
  • . . .

6
Inheritance Terminology and Notation
Insect Class
Base Class (Parent)
Grasshopper Class
Derived Class (Child)
  • The derived class inherits the member variables
    and member functions of the base class without
    any of them being rewritten
  • New member variables and functions may be added
    to the derived class to make it more specialized
    than the base class

7
Back to the is a Relationship
  • An object of a derived class 'is a(n)' object of
    the base class
  • Example
  • a Secretary is an Employee
  • a Stock is an Investment
  • A derived object has all of the characteristics
    of the base class

8
Base class GradedActivity
  • Create a base class GradedActivity that holds the
    numeric score and provides a method to calculate
    the equivalent letter grade
  • This base class provides a general way of storing
    and calculating a letter grade for any type of
    scoring
  • For example, quizzes, midterm exams, final exams,
    essays, lab reports

9
InheritanceGradedActivity.h
  • ifndef GRADEDACTIVITY_H
  • define GRADEDACTIVITY_H
  • // GradedActivity class declaration
  • class GradedActivity
  • private
  • double score // To hold the numeric score
  • public
  • // Default constructor
  • GradedActivity()
  • score 0.0
  • // Constructor
  • GradedActivity(double s)
  • score s
  • // Mutator function

10
Inheritance GradedActivity.cpp
include "GradedActivity.h" //
// Member
function GradedActivitygetLetterGrade
//
char GradedActivitygetLetterGrade()
const char letterGrade // To hold the
letter grade if (score gt 89) letterGrade
'A' else if (score gt 79) letterGrade 'B'
else if (score gt 69) letterGrade 'C' else
if (score gt 59) letterGrade 'D' else
letterGrade 'F' return letterGrade
11
Base class GradedActivity
  • The numeric score for each type of exam can be
    calculated differently
  • Equal point value for all questions
  • Different point values for each questions
  • Extra credit questions
  • The class, FinalExam, is a derived class of
    GradedActivity
  • This is indicated in FinalExam.h by the line of
    code
    class FinalExam public GradedActivity
  • FinalExam inherits the instance variable score
    and all the methods of the class GradedActivity
  • Adds on its own methods specifically needed for
    grading a final exam
  • Final Exam is a Graded Activity

12
Inheritance FinalExam.h
ifndef FINALEXAM_H define FINALEXAM_H include
"GradedActivity.h" class FinalExam public
GradedActivity private int numQuestions
// Number of questions double pointsEach //
Points for each question int numMissed
// Number of questions missed public
FinalExam() numQuestions 0 pointsEach 0.0
numMissed FinalExam(int questions, int
missed) set(questions, missed) void
set(int, int) // Defined in FinalExam.cpp
double getNumQuestions() const return
numQuestions double getPointsEach()
const return pointsEach int
getNumMissed() const return numMissed
endif
13
Inheritance FinalExam.cpp
include "FinalExam.h" //
// set function
// The
parameters are the number of questions and the
// number of questions missed.
//
void FinalExamset(int
questions, int missed) double numericScore
// To hold the numeric score // Set the
number of questions and number missed.
numQuestions questions numMissed missed
// Calculate the points for each question.
pointsEach 100.0 / numQuestions //
Calculate the numeric score for this exam.
numericScore 100.0 - (missed pointsEach)
// Call the inherited setScore function to
set the numeric score. setScore(numericScore)

14
Inheritance FinalExam.cpp
include ltiostreamgt include ltiomanipgt include
"FinalExam.h" using namespace std int main()
int questions // Number of questions on the
exam int missed // Number of questions
missed by the student cout ltlt "How many
questions are on the final exam? " cin gtgt
questions cout ltlt "How many questions did the
student miss? " cin gtgt missed // Define a
FinalExam object and initialize it with the
values entered. FinalExam test(questions,
missed) // Display the test results. cout
ltlt setprecision(2) cout ltlt "\nEach question
counts " ltlt test.getPointsEach() ltlt "
points.\n" cout ltlt "The exam score is " ltlt
test.getScore() ltlt endl cout ltlt "The exam
grade is " ltlt test.getLetterGrade() ltlt endl
return 0
15
Inheritance example
  • FinalExam.cpp runs
  • Instantiates object test of class FinalExam
  • Invokes constructor of two parameters
  • Invokes method set(questions,missed)
  • Calculates numeric score
  • Invokes setScore method of GradedActivity to set
    the instance variable score

16
Inheritance example
FinalExam class
  • Every FinalExam is a GradedActivity but not every
    GradedActivity is a Final Exam
  • A Quiz may be another derived class of
    GradedActivity
  • There may be 5 quizzes during a semester, each
    worth 20 points

GradedActivity class variable score method
setScore
  • Think of the base class as being contained within
    the derived class so that FinalExam has access to
    all of the variables and methods of GradedActivity

17
Inheritance example
  • FinalExam consists of the following
  • Private members
  • int numQuestions
  • double pointsEach
  • int numMissed
  • Public members
  • FinalExam()
  • FinalExam (int, int)
  • set(int,int)
  • getNumQuestions()
  • getPointsEach()
  • getNumMissed()
  • THESE ARE INHERITED FROM GradedActivity
  • setScore(double)
  • getScore()
  • getLetterGrade()
  • The variable score from GradedActivity is not
    listed as a member of the FinalExam class. It is
    inherited by the derived class, but because it is
    a private member of the base class, only member
    functions of the base class may access it.

18
Getting in Shape
  • Base class Shape has an instance variable area
    and functions getArea and setArea
  • Derived class Circle has its own instance
    variable radius and functions getRadius and
    setRadius
  • Note that setRadius calls function setArea and
    passes the area of the circle using the formula
    pr2
  • This sets the value of area in the base class.
    Since it is private , Circle can access it only
    via the public functions

19
Getting in Shape
  • class Shape
  • private
  • double area
  • public
  • void setArea(double a) area a
  • double getArea() return area
  • class Circle public Shape
  • private
  • double radius
  • public
  • void setRadius(double r)
  • radius r
  • setArea(3.14rr)
  • double getRadius() return radius

20
Getting in Shape
  • include ltiostreamgt
  • include "Circle.h"
  • using namespace std
  • int main()
  • Circle c
  • c.setRadius(10.0)
  • coutltlt"Area of the circle is "ltltc.getArea()ltltendl
  • return 0
  • Area of the circle is 314
  • Instantiate an object of the Circle class this
    automatically instantiates an object of the Shape
    class
  • Call the setRadius function this calls the
    setArea function of the Shape class which sets
    the private instance variable area of the Shape
    class

21
Getting in Shape
  • Create an new class named Rectangle. It has
  • private instance variables length and width of
    type double
  • public functions getLength, getWidth and
    setLengthAndWidth
  • setLengthAndWidth calls setArea with the value
    lengthwidth
  • Add code to the main program to instantiate a
    Rectangle object r, set the length to 6 and width
    to 9 and then call the getArea function on r

22
Getting in Shape
  • class Rectangle public Shape
  • private
  • double length
  • double width
  • public
  • void setLengthAndWidth(double l, double w)
  • length l
  • width w
  • setArea(lengthwidth)
  • double getLength() return length
  • double getWidth() return width

23
Getting in Shape
  • include ltiostreamgt
  • include "Circle.h"
  • include "Rectangle.h"
  • using namespace std
  • int main()
  • Circle c
  • c.setRadius(10.0)
  • coutltlt"Area of the circle is "ltltc.getArea()ltltendl
  • Rectangle r
  • r.setLengthAndWidth(6,9)
  • coutltlt"Area of the rectangle is
    "ltltr.getArea()ltltendl
  • return 0
  • Area of the circle is 314
  • Area of the rectangle is 54

24
What Does a Child Have?
  • An object of the derived class has
  • all members defined in child class
  • all members declared in parent class
  • An object of the derived class can use
  • all public members defined in child class
  • all public members defined in parent class

25
Protected Members and Class Access
  • protected member access specification like
    private, but accessible by objects of derived
    class
  • Class access specification determines how
    private, protected, and public members of base
    class are inherited by the derived class

26
Class Access Specifiers
  1. public object of derived class can be treated
    as object of base class (not vice-versa)
  2. protected more restrictive than public, but
    allows derived classes to know details of parents
  3. private prevents objects of derived class from
    being treated as objects of base class.

27
Class Access Specifiers
Base class member access in the derived class Base class member access in the derived class Base class member access in the derived class
Base Class Access Specification Private Protected Public
Private Inaccessible Private Private
Protected Inaccessible Protected Protected
Public Inaccessible Protected Public
  • Member access how a class member (instance
    variable) is declared within the class (private,
    protected or public)
  • Base Class Access how inherited base class
    members are accessed
  • The table above gives the realtionships
  • An instance variable (count) is declared public
    in class A
  • Class B is a derived class from A with base class
    access of protected
  • count is a protected member of the derived class

28
Inheritance vs. Access
29
More Inheritance vs. Access
30
More Inheritance vs. Access
31
More Inheritance vs. Access
32
Constructors and Destructors in Base and Derived
Classes
  • Derived classes can have their own constructors
    and destructors
  • When an object of a derived class is created, the
    base classs constructor is executed first,
    followed by the derived classs constructor
  • When an object of a derived class is destroyed,
    its destructor is called first, then that of the
    base class

33
Constructors Destructors in Base Derived
Classes
34
Constructors Destructors in Base Derived
Classes
35
Passing Arguments to Base Class Constructor
  • Suppose both the base and derived class have
    default constructors which are called
    automatically
  • What if the base classs constructor takes
    arguments?
  • What if there is more than one constructor in the
    base class?
  • Let the derived class constructor pass arguments
    to the base class constructor

36
Passing Arguments to Base Class Constructor
  • Allows selection between multiple base class
    constructors
  • Specify arguments to base constructor on derived
    constructor heading
  • SquareSquare(int side) Rectangle(side,
    side)
  • Can also be done with inline constructors
  • Must be done if base class has no default
    constructor

37
Passing Arguments to Base Class Constructor
derived class constructor
base class constructor
  • SquareSquare(int side)Rectangle(side,side)

derived constructor parameter
base constructor parameters
38
Passing Arguments to Base Class Constructor
ifndef RECTANGLE_H define RECTANGLE_H class
Rectangle private double width double
length public // Default constructor
Rectangle() width 0.0 length
0.0 // Constructor 2 Rectangle(double
w, double len) width w length
len double getWidth() const return
width double getLength() const return
length double getArea() const
return width length endif
39
Passing Arguments to Base Class Constructor
ifndef CUBE_H define CUBE_H include
"Rectangle.h" class Cube public
Rectangle protected double height
double volume public // Default constructor
Cube() Rectangle() height 0.0
volume 0.0 // Constructor 2
Cube(double w, double len, double h)
Rectangle(w, len) height h
volume getArea() h double getHeight()
const return height double
getVolume() const return volume
endif
Cubes not only have length and width (rectangle
properties) but height and volume as well Thus
the need to instantiate a Rectangle object when
instantiate a Cube object
40
Passing Arguments to Base Class Constructor
  • The derived class base class constructor
    notation is used only in the definition of a
    constructor, not in a prototype
  • If the constructor is defined outside the class,
    the notation would appear in the function header
  • Class Cubepublic Rectangle
  • CubeCube(double w,double len,double h)
    Rectangle(w,len)

41
Redefining Base Class Functions
  • Redefining function function in a derived class
    that has the same name and parameter list as a
    function in the base class
  • Typically used to replace a function in base
    class with different actions in derived class

42
Redefining Base Class Functions
  • Not the same as overloading with overloading,
    parameter lists must be different
  • Objects of base class use base class version of
    function objects of derived class use derived
    class version of function

43
Base Class
Note setScore function
44
Derived Class
Redefined setScore function
45
From Program 15-6
46
Problem with Redefining
  • Consider this situation
  • Class BaseClass defines functions x() and y().
    x() calls y().
  • Class DerivedClass inherits from BaseClass and
    redefines function y().
  • An object D of class DerivedClass is created and
    function x() is called.
  • When x() is called, which y() is used, the one
    defined in BaseClass or the the redefined one in
    DerivedClass?

47
Problem with Redefining
BaseClass
void X() void Y()
  • Object D invokes function X()in BaseClass.
  • Function X()invokes function Y() in BaseClass,
    not function Y()in DerivedClass, because function
    calls are bound at compile time.
  • This is static binding.

DerivedClass
void Y()
DerivedClass D D.X()
48
Class Hierarchies
  • A base class can be derived from another base
    class.

49
Class Hierarchies
  • PassFailActivity inherits score from
    GradedActivity and has its own member variable
    minPassingScore
  • PassFailExam inherits score and minPassingScore
    from PassFailActivity and has its own member
    variables numQuestions, pointsEach,numMissed
  • PassFailActivity redefines function
    getLetterGrade so that the the letter grade is
    either P or F and not A,B,C or D as computed by
    getLetterGrade in GradedActivity

50
GradedActivity .h and .cpp
  • ifndef GRADEDACTIVITY_H
  • define GRADEDACTIVITY_H
  • // GradedActivity class declaration
  • class GradedActivity
  • protected
  • double score // To hold the numeric score
  • public
  • // Default constructor
  • GradedActivity()
  • score 0.0
  • // Constructor
  • GradedActivity(double s)
  • score s
  • // Mutator function

include "GradedActivity.h" //
//Member function
GradedActivitygetLetterGrade //
char
GradedActivitygetLetterGrade() const char
letterGrade // To hold the letter grade
if (score gt 89) letterGrade 'A' else
if (score gt 79) letterGrade 'B' else
if (score gt 69) letterGrade 'C' else
if (score gt 59) letterGrade 'D' else
letterGrade 'F' return
letterGrade
51
FinalExam .h and .cpp
  • ifndef FINALEXAM_H
  • define FINALEXAM_H
  • include "GradedActivity.h"
  • class FinalExam public GradedActivity
  • private
  • int numQuestions // Number of questions
  • double pointsEach // Points for each
    question
  • int numMissed // Number of questions
    missed
  • public
  • FinalExam()
  • numQuestions 0
  • pointsEach 0.0
  • numMissed 0
  • FinalExam(int questions, int missed)
  • set(questions, missed)

include "FinalExam.h" //
// set function
// The
parameters are the number of questions and the
// number of questions missed.
//
void FinalExamset(int
questions, int missed) double numericScore
// To hold the numeric score // Set the
number of questions and number missed.
numQuestions questions numMissed missed
// Calculate the points for each question.
pointsEach 100.0 / numQuestions //
Calculate the numeric score for this exam.
numericScore 100.0 - (missed pointsEach)
// Call the inherited setScore function to
set // the numeric score.
setScore(numericScore)
52
PassFailActivity .h and .cpp
  • ifndef PASSFAILACTIVITY_H
  • define PASSFAILACTIVITY_H
  • include "GradedActivity.h"
  • class PassFailActivity public GradedActivity
  • protected
  • double minPassingScore // Minimum passing
    score.
  • public
  • // Default constructor
  • PassFailActivity() GradedActivity()
  • minPassingScore 0.0
  • // Constructor
  • PassFailActivity(double mps)
    GradedActivity()
  • minPassingScore mps
  • // Mutator
  • void setMinPassingScore(double mps)

include "PassFailActivity.h" //
// Member
function PassFailActivitygetLetterGrade //
This function returns 'P' if the score is
passing, // otherwise it returns 'F'.
//
char
PassFailActivitygetLetterGrade() const
char letterGrade if (score gt
minPassingScore) letterGrade 'P' else
letterGrade 'F' return
letterGrade
53
PassFailExam .h and .cpp
  • ifndef PASSFAILEXAM_H
  • define PASSFAILEXAM_H
  • include "PassFailActivity.h"
  • class PassFailExam public PassFailActivity
  • private
  • int numQuestions // Number of questions
  • double pointsEach // Points for each
    question
  • int numMissed // Number of questions
    missed
  • public
  • // Default constructor
  • PassFailExam() PassFailActivity()
  • numQuestions 0
  • pointsEach 0.0
  • numMissed 0
  • // Constructor
  • PassFailExam(int questions, int missed, double
    mps)

include "PassFailExam.h" //
// set
function
// The parameters are the number of questions
and the // number of questions missed.
//
void
PassFailExamset(int questions, int missed)
double numericScore // To hold the numeric
score // Set the number of questions and
number missed. numQuestions questions
numMissed missed // Calculate the
points for each question. pointsEach 100.0 /
numQuestions // Calculate the numeric
score for this exam. numericScore 100.0 -
(missed pointsEach) // Call the
inherited setScore function to set // the
numeric score. setScore(numericScore)
54
Polymorphism and
Virtual Member Functions
  • Polymorphism allows an object reference variable
    or an object pointer to reference objects of
    different types, and to call the correct member
    functions, depending upon the type of object
    being referenced

55
Polymorphism and
Virtual Member Functions
  • Virtual member function function in base class
    that expects to be redefined in derived class
  • Function defined with key word virtual
  • virtual void Y() ...
  • Supports dynamic binding functions bound at run
    time to function that they call
  • Without virtual member functions, C uses static
    (compile time) binding

56
Consider this function
Because the parameter in the displayGrade
function is a GradedActivity reference variable,
it can reference any object that is derived from
GradedActivity. That means we can pass a
GradedActivity object, a FinalExam object, a
PassFailExam object, or any other object that is
derived from GradedActivity. A problem occurs in
this program however...
57
(No Transcript)
58
  • As you can see from the example output, the
    getLetterGrade member function returned C
    instead of P.
  • This is because the GradedActivity classs
    getLetterGrade function was executed instead of
    the PassFailActivity classs version of the
    function.

59
Static Binding
  • Program 15-9 displays 'C' instead of 'P' because
    the call to the getLetterGrade function is
    statically bound (at compile time) with the
    GradedActivity class's version of the function.
  • Thus, the actual letter grade is computed instead
    of the P/F grade
  • We can remedy this by making the getLetterGrade
    function virtual.

60
Virtual Functions
  • A virtual function is dynamically bound to calls
    at runtime.
  • At runtime, C determines the type of object
    making the call, and binds the function to the
    appropriate version of the function.

61
Virtual Functions
  • To make a function virtual, place the virtual key
    word before the return type in the base class's
    declaration (or prototype)
  • virtual char getLetterGrade() const
  • If the function is defined outside the class, you
    do not place the virtual keyword in the function
    header
  • The compiler will not bind the function to calls.
    Instead, the program will bind them at runtime.

62
Updated Version of GradedActivity
The function is
now virtual.
The function also becomes virtual in all

derived classes automatically!
63
If we recompile our program with the updated
versions of the classes, we will get the right
output, shown here (See Program 15-10 in the
book.)
This type of behavior is known as polymorphism.
The term polymorphism means the ability to take
many forms. Program 15-11 demonstrates
polymorphism by passing objects of the
GradedActivity and PassFailExam classes to the
displayGrade function.
64
(No Transcript)
65
Polymorphism Requires References or Pointers
  • Polymorphic behavior is only possible when an
    object is referenced by a reference variable or a
    pointer, as demonstrated in the displayGrade
    function.
  • Polymorphic behavior is not possible when an
    object is passed by value
  • Static binding will take place when the object is
    not a reference variable or pointer, for example
  • void displayGrade (const GradedActivity activity)

66
Polymorphism Using Pointers
  • include ltiostreamgt
  • include ltiomanipgt
  • include "PassFailExam.h"
  • using namespace std
  • void displayGrade(const GradedActivity )
  • int main()
  • // Create a GradedActivity object-the score is
    88.
  • GradedActivity test1(88.0)
  • // Create a PassFailExam object. There are 100
    questions, the student missed 25 of
  • // them and the minimum passing score is 70.
  • PassFailExam test2(100, 25, 70.0)
  • // Display the grade data for both objects.
  • cout ltlt "Test 1\n"
  • displayGrade(test1) // Address of the
    GradedActivity object

67
Base Class Pointers
  • Can define a pointer to a base class object
  • Can assign it the address of a derived class
    object
  • This statement dynamically allocates a
    PassFailExam object and assigns is address to
    exam, which is a GradedActivity pointer

68
Base Class Pointers
  • include ltiostreamgt
  • include ltiomanipgt
  • include "PassFailExam.h"
  • using namespace std
  • // Function prototype
  • void displayGrade(const GradedActivity )
  • int main()
  • // Constant for the size of an array.
  • const int NUM_TESTS 4
  • // tests is an array of GradedActivity
    pointers.
  • // Each element of tests is initialized with
    the
  • // address of a dynamically allocated object.
  • GradedActivity testsNUM_TESTS
  • new GradedActivity(88.0),
  • new PassFailExam(100, 25, 70.0),

void displayGrade(const GradedActivity
activity) cout ltlt setprecision(1) ltlt
fixed cout ltlt "The activity's numeric score
is " ltlt activity-gtgetScore() ltlt endl
cout ltlt "The activity's letter grade is "
ltlt activity-gtgetLetterGrade() ltlt endl
Program Output Test 1 The activitys numeric
score is 88.0 The activitys letter grade is
B Test 2 The activitys numeric score is
75.0 The activitys letter grade is P Test
3 The activitys numeric score is 67.0 The
activitys letter grade is D Test 4 The
activitys numeric score is 76.0 The activitys
letter grade is P
69
Base Class Pointers
  • Base class pointers and references only know
    about members of the base class
  • So, you cant use a base class pointer to call a
    derived class function
  • For example, GradedActivity has 3 member
    functions besides its constrcutors setScore,
    getScore and getLetterGrade
  • A GradedActivity pointer can be used to call only
    those functions, regardless of the type of object
    it points to
  • GradedActivity exam new PassFailExam(100,25,70.
    0)
  • coutltltexam-gtgetScore()ltltendl // WORKS
  • coutltltexam-gtgetLetterGrade()ltltendl //WORKS
  • coutltltexam-gtgetPointsEach()ltltendl //ERROR

70
Base Class Pointers
  • The is-a relationship does not work in reverse
  • A final exam is a graded activity is true but
    a graded activity is a final exam is not true.
  • Not all graded activities are final exams
  • GradedActivity gaPointer new
    GradedActivity(88.0)
  • FinalExam fePointer gaPointer //WILL NOT WORK
  • A final exam has more functionality than a graded
    activity so you can not assign gaPointer to
    fePointer
  • You can make the assignment with casting this
    means fePointer points to a base class object.
  • FinalExam fePointer static_castltFinalExam
    gt(gaPointer)
  • fePointer-gtgetPointsEach() will compile but a
    runtime error will occur. fePointer is a
    FinalExam pointer that points to a GradedActivity
    object

71
Redefining vs. Overriding
  • Redefined functions in derived class will be
    ignored unless base class declares the function
    virtual
  • In C, redefined functions are statically bound
    and overridden functions are dynamically bound.
  • So, a virtual function is overridden, and a
    non-virtual function is redefined.

72
Virtual Destructors
  • It's a good idea to make destructors virtual if
    the class could ever become a base class.
  • Otherwise, the compiler will perform static
    binding on the destructor if the class ever is
    derived from.
  • If the derived class is pointed to by an object
    of the base class, only the base class destructor
    will be called
  • Making the base class destructor virtual will
    enable both destructors to execute
  • When a base class function is declared virtual,
    all overridden versions of the function in
    derived classes automatically become virtual
  • Including a virtual destructor in a base class,
    even one that does nothing, will ensure that any
    derived class destructors will also be virtual

73
Abstract Base Classes and Pure
Virtual Functions
  • Pure virtual function a virtual member function
    that must be overridden in a derived class that
    has objects
  • The abstract class represents the represents the
    generic or abstract form of all classes that are
    derived from it
  • Abstract base class contains at least one pure
    virtual function
  • virtual void Y() 0
  • The 0 indicates a pure virtual function
  • Must have no function definition in the base class

74
Abstract Base Classes and Pure Virtual Functions
  • Abstract base class class that can have no
    objects. Serves as a basis for derived classes
    that may/will have objects
  • A class becomes an abstract base class when one
    or more of its member functions is a pure virtual
    function

75
Abstract Base Classes and Pure Virtual Functions
  • In Student.h we have a pure virtual function
    virtual int
    getRemainingHours() const 0
  • This is defined in CsStudent.cpp
  • int CsStudentgetRemainingHours() const
  • int reqHours, // Total required hours
  • remainingHours // Remaining hours
  • // Calculate the required hours.
  • reqHours MATH_HOURS CS_HOURS
    GEN_ED_HOURS
  • // Calculate the remaining hours.
  • remainingHours reqHours - (mathHours
    csHours genEdHours)
  • // Return the remaining hours.
  • return remainingHours

76
Abstract Base Classes and Pure Virtual Functions
  • There is no meaning to calculating the remaining
    hours for a general student each major has its
    own requirements
  • Thus, the pure virtual function in class Student
    which is given specific definition each derived
    class

77
Multiple Inheritance
  • A derived class can have more than one base class
  • Each base class can have its own access
    specification in derived class's definition
  • class cube public square,
  • public rectSolid

78
Multiple Inheritance
  • Arguments can be passed to both base classes'
    constructors
  • cubecube(int side) square(side),
  • rectSolid(side, side, side)
  • DateTimeDateTime(int dy, int mon, int yr, int
    hr, int mt, int sc) Date(dy, mon, yr), Time(hr,
    mt, sc)
  • The order the base class constructor calls appear
    in the list does not matter. They are called in
    order of inheritance.
  • Base class constructors are called in order they
    are listed in the first line of the class
    declaration

79
Multiple Inheritance
  • Problem what if base classes have member
    variables/functions with the same name?
  • Solutions
  • Derived class redefines the multiply-defined
    function
  • Derived class invokes member function in a
    particular base class using scope resolution
    operator
  • Compiler errors occur if derived class uses base
    class function without one of these solutions
Write a Comment
User Comments (0)
About PowerShow.com