7. Inheritance and Polymorphism

Slides:



Advertisements
Similar presentations
V IRTUAL F UNCTIONS Chapter 10 Department of CSE, BUET 1.
Advertisements

Rossella Lau Lecture 8, DCO10105, Semester B, DCO10105 Object-Oriented Programming and Design  Lecture 8: Polymorphism & C++ pointer  Inheritance.
Data Abstraction and Object- Oriented Programming CS351 – Programming Paradigms.
C++ Training Datascope Lawrence D’Antonio Lecture 1 Quiz 1.
Inheritance and Polymorphism CS351 – Programming Paradigms.
Virtual Functions Junaed Sattar November 10, 2008 Lecture 10.
Shallow Versus Deep Copy and Pointers Shallow copy: when two or more pointers of the same types point to the same memory – They point to the same data.
Computer Science and Software Engineering University of Wisconsin - Platteville 7. Inheritance and Polymorphism Yan Shi CS/SE 2630 Lecture Notes.
Chapter 4 Inheritance Bernard Chen Spring Objective IS-A relationships and the allowable changes for derived classes The concept of polymorphism.
Chapter 12: Adding Functionality to Your Classes.
Learners Support Publications Pointers, Virtual Functions and Polymorphism.
1 Classes- Inheritance Multiple Inheritance It is possible to derive a new class from more than one base class. This is called Multiple Inheritance. Under.
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Taken from slides of Starting Out with C++ Early Objects Seventh Edition.
Dr. Ahmad R. Hadaegh A.R. Hadaegh California State University San Marcos (CSUSM) Page 1 Virtual Functions Polymorphism Abstract base classes.
Polymorphism &Virtual Functions
Polymorphism &Virtual Functions 1. Polymorphism in C++ 2 types ▫Compile time polymorphism  Uses static or early binding  Example: Function and operator.
Unit IV Unit IV: Virtual functions concepts, Abstracts classes & pure virtual functions. Virtual base classes, Friend functions, Static functions, Assignment.
1 Inheritance. 2 Why use inheritance?  The most important aspect of inheritance is that it expresses a relationship between the new class and the base.
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley. Ver Chapter 8: Class Relationships Data Abstraction & Problem Solving.
Chapter 3 Inheritance and Polymorphism Goals: 1.Superclasses and subclasses 2.Inheritance Hierarchy 3.Polymorphism 4.Type Compatibility 5.Abstract Classes.
Copyright 2006 Oxford Consulting, Ltd1 February Polymorphism Polymorphism Polymorphism is a major strength of an object centered paradigm Same.
C/C++ 3 Yeting Ge. Static variables Static variables is stored in the static storage. Static variable will be initialized once. 29.cpp 21.cpp.
CS-1030 Dr. Mark L. Hornick 1 Basic C++ State the difference between a function/class declaration and a function/class definition. Explain the purpose.
Chapter -6 Polymorphism
CS212: Object Oriented Analysis and Design Lecture 16: Runtime Polymorphism.
Inheritance and Composition Reusing the code and functionality Unit - 04.
1 Classes II Chapter 7 2 Introduction Continued study of –classes –data abstraction Prepare for operator overloading in next chapter Work with strings.
Recap Introduction to Inheritance Inheritance in C++ IS-A Relationship Polymorphism in Inheritance Classes in Inheritance Visibility Rules Constructor.
Polymorphism and Virtual Functions One name many shapes behaviour Unit - 07.
Class Inheritance Inheritance as an is-a relationship Public derive one class from another Protected access Initializer lists in constructor Upcasting.
CSC241 Object-Oriented Programming (OOP) Lecture No. 17.
CS 342: C++ Overloading Copyright © 2004 Dept. of Computer Science and Engineering, Washington University Overview of C++ Overloading Overloading occurs.
Polymorphism & Virtual Functions 1. Objectives 2  Polymorphism in C++  Pointers to derived classes  Important point on inheritance  Introduction to.
 Virtual Function Concepts: Abstract Classes & Pure Virtual Functions, Virtual Base classes, Friend functions, Static Functions, Assignment & copy initialization,
CSE 332: C++ Overloading Overview of C++ Overloading Overloading occurs when the same operator or function name is used with different signatures Both.
Constructors and Destructors
Inheritance Modern object-oriented (OO) programming languages provide 3 capabilities: encapsulation inheritance polymorphism which can improve the design,
Chapter 13: Pointers, Classes, Virtual Functions, and Abstract Classes
Andy Wang Object Oriented Programming in C++ COP 3330
Object-Oriented Programming (OOP) Lecture No. 45
Inheritance and Polymorphism
Polymorphism &Virtual Functions
Object-Oriented Programming & Design Lecture 18 Martin van Bommel
Object-Oriented Programming
Polymorphism.
Inheritance and Run time Polymorphism
CS212: Object Oriented Analysis and Design
Review: Two Programming Paradigms
Polymorphism & Virtual Functions
Inheritance Modern object-oriented (OO) programming languages provide 3 capabilities: encapsulation inheritance polymorphism which can improve the design,
Polymorphism Lec
Chapter 12: Pointers, Classes, Virtual Functions, and Abstract Classes
Inheritance Basics Programming with Inheritance
Java Programming Language
Virtual Functions Department of CSE, BUET Chapter 10.
Inheritance and Polymorphism:
Inheritance Virtual Functions, Dynamic Binding, and Polymorphism
Polymorphism Polymorphism
Constructors and Destructors
Computer Programming with JAVA
9: POLYMORPHISM Programming Technique II (SCSJ1023) Jumail Bin Taliba
Polymorphism Professor Hugh C. Lauer CS-2303, System Programming Concepts (Slides include materials from The C Programming Language, 2nd edition, by Kernighan.
CISC/CMPE320 - Prof. McLeod
Chapter 8: Class Relationships
Today’s Objectives 10-Jul-2006 Announcements Quiz #3
Overview of C++ Polymorphism
C++ Polymorphism Reference and pointer implicit type casting
C++ Object Oriented 1.
Lecture 6: Polymorphism
Static Binding Static binding chooses the function in the class of the base class pointer, ignoring any versions in the class of the object actually.
Presentation transcript:

7. Inheritance and Polymorphism Yan Shi CS/SE 2630 Lecture Notes

Modern Object-Oriented Concepts Modern object-oriented (OO) languages provide 3 capabilities: encapsulation inheritance polymorphism which can improve the design, structure and reusability of code.

Inheritance in C++ Syntax: Example: class Manager: public Employee class X : public Y Example: class Manager: public Employee

public, protected and private as access specifier of class members: public: everyone who knows the class can access the member protected: only the class itself and its children can access the member private: no one but the class itself can access the member as inheritance specifier: public: everyone who knows the Base and Child also knows the inheritance relation. protected: only Child and its children knows the inheritance relation. private: no one other than Child knows the inheritance relation. We only use public inheritance in this course! This guarantees all the public data and methods from the base class remain public in the derived class. With private and protected inheritance, we cannot say that the derived class is a "kind of" the base class, since the interface the base class guarantees (i.e., its public parts) becomes private or protected, respectively. Thus, private and protected inheritance represent a different way of reusing a class. http://stackoverflow.com/questions/860339/difference-between-private-public-and-protected-inheritance

What is inherited? In principle, a derived class inherits every member of a base class except: its constructor and its destructor its operator=() members its friends Although the constructors and destructors of the base class are not inherited themselves, its default constructor (i.e., its constructor with no parameters) and its destructor are always called when a new object of a derived class is created or destroyed. What if the base class has no default constructor? Can a derived class access private members of the base class?

Member Initialization List For class constructors only can be used to overload constructors Manager::Manager(string n, float rate, bool isSalaried ) : Employee( n, rate ) { salaried = isSalaried; } can be used to initialize data members in constructors Employee(string n, float rate ) : Person( n ), payRate(rate) {}

Multiple Inheritance In C++ it is possible that a class inherits members from more than one class. class Son: public Mother, public Father; However, it smells! You will learn more details in later design classes. See the example on the course page. Multiple inheritance smells, which means that usually, it was done for bad reasons, and it will blow back in the face of the maintainer.

Polymorphism polymorphism means that some code or operations or objects behave differently in different contexts. How to decide? static binding: at compilation time (overloading) dynamic binding: at run time (virtual functions) C++ uses virtual functions to implement dynamic binding. when the term polymorphism is used with C++, it refers to using virtual functions

Base Class Pointer We can assign a pointer to a base class to a variable declared using the derived class Employee * emp; emp = new Manager( name, rate, true ); cout << emp->Name() << " : $" << emp->Pay( hours ) << endl; By default, it is the type of the pointer (i.e., Employee), not the type of the object it points to (i.e., possibly Manager) that determines which version will be called. How to call Manager::Pay( hours )? Make Employee::Pay( int hours ) virtual! virtual float Pay( float hoursWorked ) const;

Virtual Function A member of a class that can be redefined in its derived classes is known as a virtual member. precede its declaration with the keyword virtual Once a method is declared as virtual, it is virtual in all derived classes too.  Destructors should always be virtual! (See example) Constructors are never virtual! Why? Constructor cannot be virtual, because when constructor of a class is executed there is no vtable in the memory, means no virtual pointer defined yet. Hence the constructor should always be non-virtual.

vtable A virtual method/function/call table is to support run-time method binding. contains an array of pointers to virtual functions Typically, the compiler creates a separate vtable for each class. When an object is created, a pointer to this vtable, called the virtual table pointer, vpointer or VPTR, is added as a hidden member of this object. For any class that contains a vtable, the compiler will also add "hidden" code to the constructor of that class to initialize the vpointers of its objects to the address of the corresponding vtable.

vtable example class C vtable for C: { +0: C::f() // pointer public: virtual void f(); void g(); virtual void h(); }; class D : public C void f(); void u(); virtual void v(); C cObj; D dObj; vtable for C: +0: C::f() // pointer +4: C::h() vtable for D: +0: D::f() // f is overloaded +4: C::h() // h is not +8: D::v()

Abstract Base Class No keyword “abstract” in C++ To make an abstract class, include at least one pure virtual function. virtual int GetValue() = 0; An abstract class cannot be instantiated! any derived class must define a body for the pure virtual function, or that derived class will be considered an abstract base class as well. An interface can be implemented in C++ as an abstract base class with only pure virtual functions.

Example class IntContainer { public: IntContainer() : count(0) { } virtual void add(int x) = 0; virtual void remove(int x) = 0; virtual bool contains(int x) const = 0; int size() const { return count; } protected: int count; }; class IntSet : public IntContainer { public: void add(int x); void remove(int x); bool contains(int x); protected: int *nums; // growable array }; IntContainer cont1; // ILLEGAL! IntContainer *cont2; // (legal) cont2 = new IntContainer; // ILLEGAL! cont2 = new IntSet; // (legal)

Type Cast of Objects Explicit conversion: Employee * emp; Manager * m = (Manager*)(emp); Traditional explicit type-casting allows to convert any pointer into any other pointer type, independently of the types they point to. The subsequent call to member functions may produce either a run-time error or a unexpected result. dynamic_cast <new_type> (expression) static_cast <new_type> (expression) reinterpret_cast <new_type> (expression) const_cast <new_type> (expression) for more information: http://www.cplusplus.com/doc/tutorial/typecasting/ reintepret cast does a simple binary copy. used to cast an integer value to a pointer. const cast: set or remove the constness of an object.

static_cast perform conversions between pointers to related classes, not only from the derived class to its base, but also from a base class to its derived. can also be used to perform any other non-pointer conversion ensures that at least the classes are compatible if the proper object is converted, but no safety check is performed during runtime to check if the object being converted is in fact a full object of the destination type.  it is up to the programmer to ensure that the conversion is safe. class CBase {}; class CDerived: public CBase {}; CBase * a = new CBase; CDerived * b = static_cast<CDerived*>(a); //valid

dynamic_cast used only with pointers and references to objects. Its purpose is to ensure that the result of the type conversion is a valid complete object of the requested class. always successful when we cast a class to one of its base classes CBase b; CBase* pb; CDerived d; CDerived* pd; pb = dynamic_cast<CBase*>(&d); // ok: derived-to-base pd = dynamic_cast<CDerived*>(&b); // wrong: base-to-derived