OBJECT ORIENTED PROGRAMMING USING C++

Similar documents
Overloading המחלקה למדעי המחשב עזאם מרעי אוניברסיטת בן-גוריון

Overriding המחלקה למדעי המחשב עזאם מרעי אוניברסיטת בן-גוריון

Chapter 11. Categories of languages that support OOP: 1. OOP support is added to an existing language

Java Object Oriented Design. CSC207 Fall 2014

Object-Oriented Languages and Object-Oriented Design. Ghezzi&Jazayeri: OO Languages 1

CREATED BY: Muhammad Bilal Arslan Ahmad Shaad. JAVA Chapter No 5. Instructor: Muhammad Naveed

What s Conformance? Conformance. Conformance and Class Invariants Question: Conformance and Overriding

Lecture 13: Object orientation. Object oriented programming. Introduction. Object oriented programming. OO and ADT:s. Introduction

OOPS Viva Questions. Object is termed as an instance of a class, and it has its own state, behavior and identity.

Data Abstraction. Hwansoo Han

Chapter 3 Function Overloading

Inheritance and Substitution (Budd chapter 8, 10)

Java: introduction to object-oriented features

What is Polymorphism? Quotes from Deitel & Deitel s. Why polymorphism? How? How? Polymorphism Part 1

CSE 452: Programming Languages. Previous Lecture. From ADTs to OOP. Data Abstraction and Object-Orientation

Polymorphism Part 1 1

Object-oriented Programming. Object-oriented Programming

CPS 506 Comparative Programming Languages. Programming Language

Outline. Java Models for variables Types and type checking, type safety Interpretation vs. compilation. Reasoning about code. CSCI 2600 Spring

Argument Passing All primitive data types (int etc.) are passed by value and all reference types (arrays, strings, objects) are used through refs.

CSE 307: Principles of Programming Languages

DATA TYPES. CS 403: Types and Classes DATA TYPES (CONT D)

OOPs Concepts. 1. Data Hiding 2. Encapsulation 3. Abstraction 4. Is-A Relationship 5. Method Signature 6. Polymorphism 7. Constructors 8.

1 Shyam sir JAVA Notes

Object Oriented Programming in Java. Jaanus Pöial, PhD Tallinn, Estonia

Inheritance and Polymorphism

Fundamentals of Programming Languages

OBJECT ORIENTED PROGRAMMING USING C++

Lecture Notes on Programming Languages

VIRTUAL FUNCTIONS Chapter 10

CS412/CS413. Introduction to Compilers Tim Teitelbaum. Lecture 17: Types and Type-Checking 25 Feb 08

Inheritance. Inheritance allows the following two changes in derived class: 1. add new members; 2. override existing (in base class) methods.

M301: Software Systems & their Development. Unit 4: Inheritance, Composition and Polymorphism

Java Fundamentals (II)

Inheritance and Interfaces

What are the characteristics of Object Oriented programming language?

A Short Summary of Javali

Object Oriented Programming. Java-Lecture 11 Polymorphism

Inheritance and object compatibility

Concepts of Programming Languages

Polymorphism. Miri Ben-Nissan (Kopel) Miri Kopel, Bar-Ilan University

HAS-A Relationship. Association is a relationship where all objects have their own lifecycle and there is no owner.

What is Inheritance?

HAS-A Relationship. If A uses B, then it is an aggregation, stating that B exists independently from A.

Lecture 7: Type Systems and Symbol Tables. CS 540 George Mason University

Introduction to Programming Using Java (98-388)

Note 12/1/ Review of Inheritance Practice: Please write down 10 most important facts you know about inheritance...

ITI Introduction to Computing II

OBJECT ORIENTED PROGRAMMING USING C++ CSCI Object Oriented Analysis and Design By Manali Torpe

ITI Introduction to Computing II

CLASS DESIGN. Objectives MODULE 4

ITI Introduction to Computing II

Fast Introduction to Object Oriented Programming and C++

Chapter 10 Classes Continued. Fundamentals of Java

Java Class Design. Eugeny Berkunsky, Computer Science dept., National University of Shipbuilding

Inheritance. Transitivity

Lecture 5: Inheritance

QUIZ. Write the following for the class Bar: Default constructor Constructor Copy-constructor Overloaded assignment oper. Is a destructor needed?

Inheritance. Benefits of Java s Inheritance. 1. Reusability of code 2. Code Sharing 3. Consistency in using an interface. Classes

ITI Introduction to Computing II

More Relationships Between Classes

Programming in C# Inheritance and Polymorphism

Cpt S 122 Data Structures. Course Review Midterm Exam # 2

Weiss Chapter 1 terminology (parenthesized numbers are page numbers)

G Programming Languages - Fall 2012

C++ Programming: Polymorphism

Conformance. Object-Oriented Programming Spring 2015

Chapter 13 Object Oriented Programming. Copyright 2006 The McGraw-Hill Companies, Inc.

index.pdf January 21,

Paytm Programming Sample paper: 1) A copy constructor is called. a. when an object is returned by value

Week 7. Statically-typed OO languages: C++ Closer look at subtyping

Subtyping (Dynamic Polymorphism)

Polymorphism. Zimmer CSCI 330

Java Inheritance. Written by John Bell for CS 342, Spring Based on chapter 6 of Learning Java by Niemeyer & Leuck, and other sources.

Object-Oriented Programming (OOP) Fundamental Principles of OOP

STRUCTURING OF PROGRAM

Data Types. Every program uses data, either explicitly or implicitly to arrive at a result.

Binding and Variables

Programming in C++ Prof. Partha Pratim Das Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur

Object typing and subtypes

Computer Science II (20073) Week 1: Review and Inheritance

COMP322 - Introduction to C++

Object Oriented Issues in VDM++

First IS-A Relationship: Inheritance

Answer: Early binding generally leads to greater efficiency (compilation approach) Late binding general leads to greater flexibility

Inheritance, Polymorphism and the Object Memory Model

Contents. I. Classes, Superclasses, and Subclasses. Topic 04 - Inheritance

Advanced oo concepts Specialization of behaviour? Multiple inheritance - alternatives to. Inner classes Classes

Inheritance -- Introduction

Software Paradigms (Lesson 3) Object-Oriented Paradigm (2)

PROGRAMMING LANGUAGE 2

The Decaf Language. 1 Lexical considerations

Inheritance and Substitution גרא וייס המחלקה למדעי המחשב אוניברסיטת בן-גוריון

INF 212/CS 253 Type Systems. Instructors: Harry Xu Crista Lopes

Agenda. Objects and classes Encapsulation and information hiding Documentation Packages

CS-202 Introduction to Object Oriented Programming

Overloading, Type Classes, and Algebraic Datatypes

301AA - Advanced Programming [AP-2017]

Data type of a pointer must be same as the data type of the variable to which the pointer variable is pointing. Here are a few examples:

Introduction to C++ Introduction to C++ Dr Alex Martin 2013 Slide 1

Transcription:

OBJECT ORIENTED PROGRAMMING USING C++ 1

Overloading, Overriding

POLYMORPHISM poly morphos many forms Overloading single method name having several alternative implementations. Overriding child class provides alternative implementation for parent class method. Polymorphic variable a variable that is declared as one type but holds a value of a different type.

Example : Class Shape { Polymorphic Variable Class Triangle extends Shape { Shape s = new Triangle; Java all variables can be polymorphic. C++ only pointers and references can be polymorphic.

Method Binding Determining the method to execute in response to a message. Binding can be accomplished either statically or dynamically. Static Binding Also known as Early Binding. Resolved at compile time. Resolution based on static type of the object(s). Dynamic Binding Also known as Late Binding. Resolved at run-time. Resolution based on the dynamic type of the object(s). Uses method dispatch table or Virtual function table.

Method Binding Example Class Shape { public: virtual void Draw() { cout << Shape Draw! << endl; Class Triangle : public Shape { public: void Draw() { cout << Triangle Draw! << endl; Shape * sptr = new Triangle(); Sptr->Draw(); // Triangle Draw!

Overloading Overloading Based on Scopes Overloading based on Type Signatures

Overloading Based on Scopes Overloading same method name in different scopes. the scopes cannot overlap. No restriction on semantic similarity. No restriction on type signatures. Resolution of overloaded names based on class of receiver. Example Class SomeCards { Draw() { Class SomeGame { Draw() { // Paint the face of the card // Remove a card from the deck of cards

Overloading Overloading Based on Type Signatures same method name with different implementations having different type signatures. Resolution of overloaded names is based on type signatures. Occurs in object-oriented languages (C++, Java, C#, Delphi Pascal) Occurs in imperative languages (Ada), and many functional languages. Class Example { Add(int a) { return a; Add(int a, int b) { return a + b; Add(int a, int b, int c) { return a + b + c; C++ allows methods as well as operators to be overloaded. Java does not allow operators to be overloaded.

Overloading and Method Binding Resolution of Overloaded Methods Method binding at compile time. Based on static types of argument values Methods cannot be overloaded based on differences in their return types alone. Class SomeParent { Class SomeChild : public SomeParent { void Test (SomeParent *sp) { cout << In Parent ; void Test (SomeChild *sc) { cout << In Child ; SomeParent *value = new SomeChild(); Test(value); // In Parent

Overloading Example Overloading can be used to extend library functions and operators so they can work with user-defined data types. Class Fraction private: int t, b; public: Fraction (int num, int denum) { t = num; b = denum; int numerator() { return t; int denominator() { return b; ostream & operator << (ostream & destination, Fraction & source) { destination << source.numerator() << / << source.denominator; return destination;

Some Associated Mechanisms Coercion and Conversion Redefinition Polyadicity Multi-Methods

Coercion and Conversion Used when actual arguments of a method do not match the formal parameter specifications, but can be converted into a form that will match Coercion - implicitly implemented Example floatvar = intvar; Conversion - explicitly requested by the programmer Example floatvar = (double) intvar;

Substitution as Conversion Used when there is parent-child relationship between formal and actual parameters of a method Dessert void order ( Dessert d, Cake c ); void order ( Pie p, Dessert d ); void order ( ApplePie a, Cake c ); Pie Cake ApplePie ChocolateCake order (adessert, acake); order (anapplepie, adessert) order (adessert, adessert); order (anapplepie, achocolatecake) order (apie, acake); // illegal

Substitution as Conversion Resolution rules (when substitution is used as conversion in overloaded methods) If there is an exact match, execute that method. If there are more than one matching methods, execute the method that has the most specific formal parameters. If there are two or more methods that are equally applicable, the method invocation is ambiguous, so generate compiler error. If there is no matching method, generate compiler error.

Conversion operators in C++ Conversion (these are the user supplied conversions) One-argument constructor : to convert from argument type to class type. Fraction (int value) { t = value; b = 1; // Converts int into Fraction Operator with type name as its name : to convert class type to named type. operator double () { // Converts Fraction into double return numerator() / (double) denominator;

Conversion Rules for Resolution of Overloaded methods (taking into account all of the various conversion mechanisms) execute method whose formal parameters are an exact match for the actual parameters match using standard type promotions (e.g. integer to float) match using standard substitution (e.g. child types as parent types) match using user-supplied conversions (e.g. one-argument constructor, type name operator) if no match found, or more than one method matches, generate compiler error

Redefinition When a child class defines a method with the same name as a method in the parent class but with a different type signature. Class Parent { public void Test (int a) { Class Child extends Parent { public void Test (int a, int b) { Child achild = new Child(); achild.test(5); How is it different from overrriding? Different type signature in Child class.

Two approaches to resolution Merge model used by Java, C# Redefinition method implementations found in all currently active scopes are merged into one list and the closest match from this list is executed. in the example, parent class method wil be executed. Hierarchical model used by C++ each currently active scope is examined in turn to find the closest matching method in the example, compilation error in Hierarchical model Delphi Pascal - can choose which model is used merge model - if overload modifier is used with child class method. Hierarchical model - otherwise.

Polyadicity Polyadic method - method that can take a variable number of arguments. printf( %s, strvar); printf( %s, %d, strvar, intvar); Easy to use, difficult to implement printf in C and C++; writeln in Pascal; + operator in CLOS #include <stdarg.h> int sum (int argcnt, ) // C++ uses a data structure called { // variable argument list va_list ap; int result = 0; va_start(ap, argcnt); while (argcnt > 0) { result += va_arg(ap, int); argcnt--; va_end(ap); return result;

Optional Parameters Another technique for writing Polyadic methods. Provide default values for some parameters. If values for these parameters are provided then use them, else use the default values. Found in C++ and Delphi Pascal AmtDue(int fixedcharge); AmtDue(int fixedcharge, int fines); AmtDue(int fixedcharge, int fines, int missc); same as AmtDue(int fixedcharge, int fines = 0, int missc = 0);

Multi-Methods Multi-Methods combines the concepts of overloading and overriding. Method resolution based on the types of all arguments and not just the type of the receiver. Resolved at runtime. The classes integer and real are derived from the parent class number. function add (Integer a, Integer b) : Integer { function add (Integer a, Real b) : Real { function add (Real a, Integer b) : Real { function add (Real a, Real b) : Real { Number x = ; Number y = ; Real r = 3.14; Real r2 = add(r, x); Real r3 = add(x, y); // x and y are assigned some unknown values // which method to execute // this is not type safe

Multi-Methods Double dispatch a message can be used to determine the type of a receiver. To determine the types of two values, the same message is sent twice, using each value as receiver in turn. Then execute the appropriate method.

Overloading Based on Values Overloading based on values overload a method based on argument values and not just types. Occurs only in Lisp-based languages - CLOS, Dylan. High cost of method selection algorithm. Example function sum(a : integer, b : integer) {return a + b; function sum(a : integer = 0, b : integer) {return b; The second method will be executed if the first argument is the constant value zero, otherwise the first method will be executed.

Overriding A method in child class overrides a method in parent class if they have the same name and type signature. Overriding classes in which methods are defined must be in a parent-child relationship. Type signatures must match. Dynamic binding of messages. Runtime mechanism based on the dynamic type of the receiver. Contributes to code sharing (non-overriding classes share same method).

C++ Overriding Notation class Parent { public: virtual int test (int a) { class Child : public Parent { public: int test (int a) { C# class Parent { public virtual int test (int a) { class Child : Parent { public override int test (int a) {

Java Overriding Notation class Parent { public int test (int a) { class Child extends Parent { public int test (int a) { Object Pascal type Parent = object function test(int) : integer; end; Child = object (Parent) function test(int) : integer; override; end;

Overriding Overriding as Replacement child class method totally overwrites parent class method. Parent class method not executed at all. Smalltalk, C++. Overriding as Refinement Parent class method executed within child class method. Behavior of parent class method is preserved and augmented. Simula, Beta Constructors always use the refinement semantics of overriding.

In support of code reuse Replacement in SmallTalk Person GenerateReport Director Manager Trainee GenerateReport <------------------ Code Reuse -----------------------> <-----------------------> Overriden method as replacement

In support of code optimization Replacement in SmallTalk Boolean & right True & right class boolean {& right self iftrue: [right iftrue: [^true] ]. ^ false False & right class True {& right ^ right class False {& right ^ false

Refinement in Beta Always code from parent class is executed first. When inner statement is encountered, code from child class is executed. If parent class has no subclass, then inner statement does nothing. Example class Parent { class Child extends Parent { public void printresult () { public void printresult () { print( < Parent Result; ); print( Child Result; ); inner; print( > ); Parent p = new Child(); p.printresult(); < Parent Result; Child Result; > inner;

Simulation of Refinement using Replacement C++ Object Pascal void Parent::test () { procedure Parent.test (); cout << in parent \n ; begin writeln( in parent ); void Child::test () { end; Parent::test(); procedure Child.test (); cout << in child \n ; begin inherited test (); writeln( in child ); end; Java class Parent { void test () {System.out.println( in parent ); class Child extends Parent { void test () { super.test(); System.out.println( in child );

Refinement Vs Replacement Refinement Conceptually very elegant mechanism Preserves the behavior of parent. (impossible to write a subclass that is not also a subtype) Cannot simulate replacement using refinement. Replacement No guarantee that behavior of parent will be preserved. (it is possible to write a subclass that is not also a subtype). Can be used to support code reuse and code optimization Can simulate refinement using replacement.

Wrappers in CLOS This mechanism can be used to simulate refinement. A subclass overrides parent method and specifies a wrapping method. Wrapping method can be before method after method around method (defclass parent () () ) (defclass child (parent) ) (defmethod test ((x parent)) (print test parent )) (defmethod atest :after ((x child)) (print atest child )) (defmethod btest :before ((x child)) (print btest child )) (defmethod rtest :around ((x child)) (list rtest chld before (call-next-method) rtest chld after )) (defvar achild (make-instance child)) (atest achild) atest child test parent (atest achild) test parent btest child (atest achild) rtest chld before test parent rtest chld after

Deferred Methods Defined but not implemented in parent class. Also known as abstract method (Java) and pure virtual method (C++) Associates an activity with an abstraction at a higher level than it actually is. Shape virtual Draw() = 0 Circle Draw() Triangle Draw() Square Draw() Used to avoid compilation error in statically typed languages.

Deferred Method Example C++ class Shape { public: virtual void Draw () = 0; Java abstract class Shape { abstract public void Draw (); Smalltalk Draw child class should override this ^ self subclassresponsibility (Smalltalk does implement the deferred method in parent class but when invoked will raise an error)

Shadowing Child class implementation shadows the parent class implementation of a method. As example in C++, when overridden methods are not declared with virtual keyword. Resolution is at compile time based on static type of the receiver. class Parent { public: void test () { cout << in Parent << endl; class Child : public Parent { public: void test () { cout << in Child << endl; Parent *p = new Parent(); p->test(); Child *c new Child(); c->test(); p = c; p->test(); // in Parent // in Child // in Parent

Overriding, Shadowing and Redefinition Overriding Same type signature and method name in both parent and child classes. Method declared with language dependent keywords indicating overriding. Shadowing Same type signature and method name in both parent and child classes. Method not declared with language dependent keywords indicating overriding. Redefinition Same method name in both parent and child classes. Type signature in child class different from that in parent class.

Covariance and Contravariance An overridden method in child class has a different type signature than that in the parent class. Difference in type signature is in moving up or down the type hierarchy. class Parent { public void test (Shape s, Square sq) {... Parent Test(Shape covar, Square contravar) class Child extends Parent { public void test (Square sq, Shape s) {... Child Test(Square covar, Shape contravar)

Covariance and Contravariance Covariant change - when the type moves down the type hierarchy in the same direction as the child class. Parent avalue = new Child(); avalue.func(atriangle, asquare); // Run-time error // No compile-time error Contravariant change - when the type moves in the direction opposite to the direction of subclassing. Parent avalue = new Child(); avalue.func(asquare, asquare); // No errors

Covariance and Contravariance Covariant change in return type Shape func () { return new Triangle(); // In Parent Class Square func () { return new Square(); // In Child Class Parent avalue = new Child(); Shape ashape = avalue.func(); // No compile-time or Run-Time errors Contravariant change in return type Square func () { return new Square(); // In Parent Class Shape func () { return new Triangle(); // In Child Class Parent avalue = new Child(); Square asquare = avalue.func(); // No compile-time errors // Run-Time error C++ allows covariant change in return type. Eiffel, Sather allows both covariant and contravariant overriding Most other languages employ novariance

And Finally... Java final keyword applied to functions prohibits overriding. final keyword applied to classes prohibits subclassing. C# sealed keyword applied to classes prohibits subclassing. sealed keyword cannot be applied to individual functions.