Title: Object Oriented Programming Development - Multi File Development
1Object Oriented ProgrammingDevelopment - Multi
File Development
- By
- Marc Conrad Rob Manton
- University of Luton
- Email
- Marc.Conrad_at_luton.ac.uk
- Rob.Manton_at_luton.ac.uk
- Room
- D104
2Module Outline
- Inheritance
- Aggregation
- Polymorphism
- Multifile Development
- Introduction
- Non object oriented basics
- Classes
3Todays lecture
- Polymorphism II recap
- Polymorphic Pointers
- Overriding Methods
- Static typing Dynamic binding
- Multi File Development
- Referring to classes not yet defined
- .H and .CPP files
- Libraries
4Polymorphic Pointers
- In C a pointer of a parent class is allowed to
point to an object of the child class. E.g. - class Vehicle
- // ...
-
- class Car public Vehicle
- // ...
-
- // ...
- Vehicle vp new Car()
5Overriding Methods
- Three ways for a derived class to implement a
polymorphic method - Inherit it unchanged
- Replace with a different implementation
- Add to the existing implementation
6Overriding Methods
- Methods in the parent class can be redefined in
the child class. - class Vehicle
- void move(int i)
-
- class Car public Vehicle
- void move(int i)
-
- // ...
- Vehicle vp new Car()
- vp-gtmove(100)
7Overriding Methods
- Methods in the parent class can be redifined in
the child class. - class Vehicle
- void move(int i)
-
- class Car public Vehicle
- void move(int i)
-
- // ...
- Vehicle vp new Car()
- vp-gtmove(100)
- BUT
- Which of these two move() methods will be called?
8Overriding Methods
- Methods in the parent class can be redifined in
the child class. - class Vehicle
- void move(int i)
-
- class Car public Vehicle
- void move(int i)
-
- // ...
- Vehicle vp new Car()
- vp-gtmove(100)
- static typing!
- In C, static typing is the default behaviour.
As vp is of type pointer to a Vehicle, the method
of the Vehicle is called.
9(No Transcript)
10As vp is of type pointer to a Vehicle, the method
of the Vehicle is called.
11Overriding Methods - The keyword virtual
- Methods in the parent class can be redefined in
the child class. - class Vehicle
- virtual void move(int i)
-
- class Car public Vehicle
- virtual void move(int i)
-
- // ...
- Vehicle vp new Car()
- vp-gtmove(100)
- dynamic binding!
- The keyword virtual allows the use of dynamic
binding.
As vp points to a Car object the method of the
Car is called
12(No Transcript)
13Dynamic Binding As vp points to a Car object
the method of the Car is called
14Abstract Methods Classes
- Abstract methods are methods without any
implementation (pure virtual methods). - class Vehicle
- virtual void move(int i) 0
-
- class Car public Vehicle
- virtual void move(int i)
-
- // ...
- Vehicle vp new Car()
- vp-gtmove(100)
- Syntax for declaring abstract methods.
Note that Vehicle objects cannot be instantiated
(but Car objects can).
15Syntax for declaring abstract methods.
We are not allowed to declare an object of an
abstract type...
16Static typing Dynamic binding
- Static typing means that the legality of a member
function invocation is checked at the earliest
possible moment by the compiler at compile time.
The compiler uses the static type of the pointer
to determine whether the member function
invocation is legal.
- Dynamic binding means that the address of the
code in a member function invocation is
determined at the last possible moment based on
the dynamic type of the object at run time. It is
called "dynamic binding" because the binding to
the code that actually gets called is
accomplished dynamically (at run time).
17Why is dynamic binding useful?
- If we have a variety of classes based on the same
base class then each type can be pointed to by a
pointer to the base class - animal pAnimal
- pAnimalnew sheep()
- pAnimalnew crocodile()
Animal
mammal
reptile
human
sheep
crocodile
18Why is dynamic binding useful?
- Any method declared in the base class..
Animal
MakeNoise()
mammal
reptile
human
sheep
crocodile
19Why is dynamic binding useful?
- Any method declared in the base class... ..can be
overridden by any derived class
Animal
MakeNoise()
mammal
reptile
MakeNoise()
MakeNoise()
human
sheep
crocodile
MakeNoise()
MakeNoise()
MakeNoise()
20Why is dynamic binding useful?
- With static binding, the version of the method
that gets called is the one defined in the base
class (not so useful!) - animal pAnimal
- pAnimalnew sheep()
- pAnimal-gtMakeNoise()
Animal
MakeNoise()
mammal
reptile
MakeNoise()
MakeNoise()
human
sheep
crocodile
MakeNoise()
MakeNoise()
MakeNoise()
21Why is dynamic binding useful?
- With dynamic binding, the version of the method
that gets called is the one defined in the class
of the object that the pointer points to - animal pAnimal
- pAnimalnew sheep()
- pAnimal-gtMakeNoise()
Animal
virtual MakeNoise()
mammal
reptile
MakeNoise()
MakeNoise()
human
sheep
crocodile
MakeNoise()
MakeNoise()
MakeNoise()
22Why is dynamic binding useful?
- At compile time we can create a pointer to the
base class and call a method defined in the base
class. This should compile properly. - At run time we can make that pointer point to an
object of any class in the same inheritance
hierarchy and the correct version of the method
gets called. - Very useful for handling situations where the
number or composition or lifespan of objects
cannot be predicted at compile time
23Practical example
- In a computer game we might have an inheritance
hierarchy containing many different characters
(old man, woman, alien, spider, goblin, martial
arts expert etc etc) all derived from a base
character class.
Character
Update() Draw()
24Practical example
Character
Human
Animal
Old man
Martial arts expert
Alien
spider
Each derived class can override the base class
methods and provide its own update() and draw()
methods
25Practical example
- We dont need to know at compile time how many of
each type of character will exist at any time
during the game - We can have an array of pointers or a linked list
or other container object to store a variable
number of character objects - Character characters50
26Practical example
- At run time we can allocate dynamically created
objects of any of the classes in the hierarchy to
the pointers - eg characters1new Alien()
- characters2new Spider()
- characters3new OldMan()
27Practical example
- Because they are all derived from a standard base
class we can call the same methods of each
derived character - for (i0ilt50i)
-
- if (Charactersi!NULL)
-
- Characteri-gtUpdate()
- Characteri-gtDraw()
-
28Practical example
- Polymorphism in action
- a single method name being called from different
types of object (old man, spider, martial arts
expert, alien etc) - Caters well with situations where number or
composition or life time of objects cant be
predicted at compile time..
29Important stuff to remember
- Overriding methods
- Polymorphic pointers
- Static binding
- Dynamic binding - the virtual keyword
- Abstract methods
30Referring to classes not yet defined
- If a class contains or references another class
(aggregation or association) then the compiler
needs the enclosed class to be defined first -
what happens if we have a circular relationship?
31Referring to classes not yet defined
- what happens if we have a circular relationship -
which class goes first? - class Car
-
- private
- Person myDriver
-
- class Person
-
- private
- Car myCar
Car has a pointer to person and person has a
pointer to car
32Referring to classes not yet defined
Person object not defined yet so we get an error
message
33Referring to classes not yet defined
- Solution is to provide a forward declaration of
the class which is being used but hasnt been
declared yet - class Person
- class Car
-
- private
- Person myDriver
-
- class Person
-
- private
- Car myCar
Forward declaration of Person class means that
compiler lets you refer to Person class even
though Person class hasnt been declared yet
34Referring to classes not yet defined
Car has a pointer to person and person has a
pointer to car forward declaration makes
this legal!
35.H and .CPP files
- On larger projects class definitions and
implementations are usually split up - definitions go into a .H file
- implementations into a .CPP file
- can do this automatically in the compiler with
Insert/New Class
36.H and .CPP files
Name of class
Insert/New Class
Optional base class
37.H and .CPP files
.h and .cpp files now appear in project
Skeleton for class implementation
Skeleton for class definition
38.H and .CPP files
If we refer to a class defined in separate file
we get an error
39.H and .CPP files
Need to include the .h header file then all is
OK!
40Using libraries
- Rapid application development - using existing
modules or libraries rather than writing your own - Ready made libraries like DirectX, OpenGL,
Renderware etc comprise of a set of Header files
(.H) and a set of library files (.LIB) - A static library (.LIB) is a file containing
objects that is linked into your program when the
executable file is built.
41Using libraries
- Dont need to recompile the library files each
time - saves time - Preserves security of source code (commercial
reasons) - User only needs to know about the interface to
the classes which is defined in the header file - follows C notion of separation of interface
from implementation
42Using libraries
- How do you make a library file?
Static library is an option in the usual File/New
Dialog
43Using libraries
- How do you use an existing library file?
- Insert both the .lib file and the.h header file
into your project using Project/Add to
project/Files - Add the folder that contains the library/header
files to the list of paths in Tools/Options/Direct
ories
One list of folders relates to include files
(.h) another to library (.lib) files
44Thats all for today
- First session after Christmas will be revision
for the exam - See you then and have a good one..