Programming Methodology

Similar documents
Note 3. Types. Yunheung Paek. Associate Professor Software Optimizations and Restructuring Lab. Seoul National University

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

CSC 533: Organization of Programming Languages. Spring 2005

G Programming Languages Spring 2010 Lecture 6. Robert Grimm, New York University

Introduction Primitive Data Types Character String Types User-Defined Ordinal Types Array Types. Record Types. Pointer and Reference Types

Types. What is a type?

CPSC 3740 Programming Languages University of Lethbridge. Data Types

Fundamentals of Programming Languages

Lecture 12: Data Types (and Some Leftover ML)

TYPES, VALUES AND DECLARATIONS

22c:111 Programming Language Concepts. Fall Types I

NOTE: Answer ANY FOUR of the following 6 sections:

Programming Languages

Question No: 1 ( Marks: 1 ) - Please choose one One difference LISP and PROLOG is. AI Puzzle Game All f the given

Pierce Ch. 3, 8, 11, 15. Type Systems

Programming Methodology

CSCI312 Principles of Programming Languages!

Principles of Programming Languages

Lecture Overview. [Scott, chapter 7] [Sebesta, chapter 6]

Data Types. Outline. In Text: Chapter 6. What is a type? Primitives Strings Ordinals Arrays Records Sets Pointers 5-1. Chapter 6: Data Types 2

HANDLING NONLOCAL REFERENCES

Programming Languages

Organization of Programming Languages CS320/520N. Lecture 06. Razvan C. Bunescu School of Electrical Engineering and Computer Science

Data Types In Text: Ch C apter 6 1

CSE 431S Type Checking. Washington University Spring 2013

Data Types (cont.) Subset. subtype in Ada. Powerset. set of in Pascal. implementations. CSE 3302 Programming Languages 10/1/2007

CS 330 Lecture 18. Symbol table. C scope rules. Declarations. Chapter 5 Louden Outline

The Compiler So Far. CSC 4181 Compiler Construction. Semantic Analysis. Beyond Syntax. Goals of a Semantic Analyzer.

Programming Languages, Summary CSC419; Odelia Schwartz

CS 430 Spring Mike Lam, Professor. Data Types and Type Checking

Data Types (cont.) Administrative Issues. Academic Dishonesty. How do we detect plagiarism? Strongly Typed Languages. Type System

Questions? Static Semantics. Static Semantics. Static Semantics. Next week on Wednesday (5 th of October) no

Expressions and Assignment

Chapter 6. Data Types ISBN

Organization of Programming Languages CS3200 / 5200N. Lecture 06

Structuring the Data. Structuring the Data

Tokens, Expressions and Control Structures

Introduction. Primitive Data Types: Integer. Primitive Data Types. ICOM 4036 Programming Languages

Type Bindings. Static Type Binding

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

Object Oriented Paradigm

Storage. Outline. Variables and Updating. Composite Variables. Storables Lifetime : Programming Languages. Course slides - Storage

Final-Term Papers Solved MCQS with Reference

Chapter 6. Structured Data Types. Topics. Structured Data Types. Vectors and Arrays. Vectors. Vectors: subscripts

STUDY NOTES UNIT 1 - INTRODUCTION TO OBJECT ORIENTED PROGRAMMING

9/7/17. Outline. Name, Scope and Binding. Names. Introduction. Names (continued) Names (continued) In Text: Chapter 5

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

Data Types. (with Examples In Haskell) COMP 524: Programming Languages Srinivas Krishnan March 22, 2011

Data types. Definitions Aggregate constructors User-defined type definitions Types and storage Types and subtypes Type systems and type checking

UNIT II Structuring the Data, Computations and Program. Kainjan Sanghavi

Data Types. Data Types. Introduction. Data Types. Data Types. Data Types. Introduction

G Programming Languages - Fall 2012

VALLIAMMAI ENGINEERING COLLEGE

Imperative Programming

Semantic Analysis. How to Ensure Type-Safety. What Are Types? Static vs. Dynamic Typing. Type Checking. Last time: CS412/CS413

Chapter 6 part 1. Data Types. (updated based on 11th edition) ISBN

Polymorphism. Contents. Assignment to Derived Class Object. Assignment to Base Class Object

Discussion. Type 08/12/2016. Language and Type. Type Checking Subtypes Type and Polymorphism Inheritance and Polymorphism

A declaration may appear wherever a statement or expression is allowed. Limited scopes enhance readability.

Midterm CSE 131B Spring 2005

For each of the following variables named x, specify whether they are static, stack-dynamic, or heapdynamic:

9/21/17. Outline. Expression Evaluation and Control Flow. Arithmetic Expressions. Operators. Operators. Notation & Placement

COSC252: Programming Languages: Basic Semantics: Data Types. Jeremy Bolton, PhD Asst Teaching Professor

SE352b: Roadmap. SE352b Software Engineering Design Tools. W3: Programming Paradigms

Chapter 5 Names, Binding, Type Checking and Scopes

CSE 452: Programming Languages. Where are we? Types: Intuitive Perspective. Data Types. High-level Programming Languages.

CMSC 330: Organization of Programming Languages

Types II. Hwansoo Han

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

COS 140: Foundations of Computer Science

CSE 307: Principles of Programming Languages

CSCI-GA Scripting Languages

Topics Covered Thus Far. CMSC 330: Organization of Programming Languages. Language Features Covered Thus Far. Programming Languages Revisited

Francesco Nidito. Programmazione Avanzata AA 2007/08

CSCE 314 Programming Languages. Type System

Types and Type Inference

What are the characteristics of Object Oriented programming language?

Short Notes of CS201

Names, Scopes, and Bindings II. Hwansoo Han

Design Issues. Subroutines and Control Abstraction. Subroutines and Control Abstraction. CSC 4101: Programming Languages 1. Textbook, Chapter 8

Types and Type Inference

CS201 - Introduction to Programming Glossary By

Inheritance, Polymorphism and the Object Memory Model

Strict Inheritance. Object-Oriented Programming Spring 2008

Lecture Notes on Programming Languages

Expression Evaluation and Control Flow. Outline

Programming Languages Third Edition. Chapter 7 Basic Semantics

Strict Inheritance. Object-Oriented Programming Winter

Type systems. Static typing

Basic Types & User Defined Types

Final CSE 131B Spring 2004

CS113: Lecture 3. Topics: Variables. Data types. Arithmetic and Bitwise Operators. Order of Evaluation

G Programming Languages - Fall 2012

G Programming Languages - Fall 2012

QUIZ on Ch.5. Why is it sometimes not a good idea to place the private part of the interface in a header file?

Storage. Outline. Variables and updating. Copy vs. Ref semantics Lifetime. Dangling References Garbage collection

C++ Important Questions with Answers

Lecture 16: Static Semantics Overview 1

1 Terminology. 2 Environments and Static Scoping. P. N. Hilfinger. Fall Static Analysis: Scope and Types

CS 3360 Design and Implementation of Programming Languages. Exam 1

Transcription:

Spring 2009 Types

2 Topics Definition of a type Kinds of types Type binding and checking Type conversion Polymorphism

Programming language constructs 3 types statements blocks procedures/functions int foo(char* l) { int j, k; float x, y, z; j = 0; while (j < n) { x = 2.0 * y + z; } } main() { int m; m = foo(list); } variables expressions parameters

Types 4 Types correspond to naturally occurring categories, such as those found in the real world. Ex: student, university, car, integer, character, string, stack, heap, Types enable us to represent/operate on bundles of descriptive data items/attributes for each category with a single name. Student has name, GPA... University has departments String has length GPA has a real value that is recalculated every semester. Departments are newly added/removed, or have new names. Stack length is increased or decreased at time goes by. Once a new type is defined, you can construct any number of class objects that belong to that class student objects, university objects, integer objects, stack objects,

Components of a data type 5 Data type Data items/representation a set of data items/representation that model a collection of abstract objects in the real world ex: in C language int integers, student id, # of departments, stack length... char[] letters, names,... a set of operations/routines that can be applied to the objects int: + - * / add, subtract, multiply, divide for integers char[]: append, copy, concatenate Routines/Operations

Using types... 6 improves readability and writability. Ex: char* student_name; struct employee_records { char* name; int salary; } reduces programming errors. Ex: student_name / 5 makes memory allocation and data access efficient. Ex: struct { int i; char* c; } // 8 bytes Sizes are statically known. Useful for the compiler to optimize memory allocation (e.g., use stack in stead of heap)

Hierarchies of types in most languages 7 data types primitive/simple pointer composite character numeric boolean struct/record array string integer enum floating point fixed point C/C++ char, int/long, float/double, struct/class, array, string(?) Java boolean no clear distinction between char and int, no special op for char/string

Selection of data types 8 What kinds of types should be included in a language is very important for programming language design. Primitive/simple types are supported in almost all existing programming languages Composite types being supported differ from language to language based on what is the purpose of the language. Several issues related to the selection of types fixed point vs. floating point real numbers array bounds structure of composite types pointer types subtypes Cobol for string type? The class type for OO languages

Fixed point vs. Floating point 9 fixed point decimal point for decimal numbers Precision and scale are fixed. a fixed radix point for all real numbers of the same type ex: salary amount of graduate assistants 6 digits for precision and 2 digits for scale 1234.56, 2000.00 floating point radix points are floating ex: 21.32, 9213.1, 4.203e+9 COBOL, PL/1 and Ada support the fixed point real type, but most of other languages (Fortran, C,...) don't. Ada: type salary is delta 0.01 range 0.0..3000.0 C++: float salary;

Fixed point vs. Floating point 10 Problem with fixed point possible loss of information after some operations at run time ex: double the salary of EE students! Problem with floating point Large numbers may be machine dependent. ex: port a C program to 32 bit and 64 bit machines! Less secure ex: double the salary illegally

Composite types 11 array/string types a homogeneous aggregation of data elements student ids, exam scores, profit earned every day,. An individual element is identified by its relative position in the array. int A int A[11]; A[0] A[1] A[2] struct/record/union types used to model collections of data that are of heterogeneous forms personal record of each student (name,addr,sex,id,}, table entries, Each data element is identified by its name. m int x double long struct Sty S; S.m S.x S.n l String n S.l S.l[3] struct Sty { int m; double x; long n; String l; } S;

Composite types 12 union types Similar to struct types in that both store heterogeneous data. A union saves memory by sharing locations among its elements. It may store different type data elements in the shared locations at different times during program execution. union Uty m x U; Ex: a group of members in a company Everybody has a name and a SS#. An employee has the department that he/she belongs to. An employer (stock holder?) has the percentage of share in the company. l int String long/double n struct Member { String name; long SSN; union { String dept; float share; } f; Member M[100]; M[i].name M[i].f.dept

Determination of array bounds 13 static arrays (C/C++, Fortran, Pascal) array bounds determined at compile time and static storage allocation. ex: efficient int a[10], b[5]; dynamic (C/C++, Fortran90): array bounds determined at run time and dynamic storage allocation ex: for scientific/engineering apps) int *a, *b; a = b = new int[10] expensive, but flexible (useful delete [] a; // a is freed only when explicitly demanded b[3] // error: dangling pointer b = new int[20]; stack dynamic (C/C++, Ada) array bounds determined at run time but static storage allocation ex: void foo (int n) { int* q = (int*) alloca(n); // stack dynamic int* p = new int[n]; // dynamic } //q is freed when foo returns

Array bounds as a data type 14 Many languages (e.g., C/C++ and Fortran) don t include array bounds as a type. needs complex memory managements and error prone ex: float *x = new int[5]; // OK x[i] = ; // what if i > 5? x = new int [10]; // OK but more flexible consider the function foo in the Pascal code Some languages (e.g., Java and Pascal) where security is of high priority include array bounds as a data type. What does this imply to programming?

Array bounds as a data type 15 Including array bounds as a data type implies 1. All arrays are static. 2. Illegal array assignments & parameter passing can be detected at compile time, or critical faults will be prevented at run time via exception control. ex: int z [] = new int [5]; // OK: creation w/o initialization int y [] = { 3, 6, 9, 12, 15 // OK: creation w/ initialization int x []; x = new int [5]; // OK x = new int [10]; // error: x s size must be static! z[5] = ; // error: out of bound detectable at compile time = y[i] + // if i 5 or i < 0, an exception will be raised at run time Exception in thread main ava.lang.arrayindexoutofboundsexception: line#

Equivalence in struct types 16 Is this assignment legal? If yes structure equivalence If no name equivalence/compatibility For C++ : error! man cannot be converted to woman To avoid this error, assignment operator = for class woman/man must be explicitly defined for type conversion from man to woman Pros and cons of name equivalence easy type checking by string comparison fast compilation more secure and less error prone compilation Jane = Tom; (unsafe!) But!... less flexible programming Cannot be compatible with anonymous type Type must be globally defined. Why? struct man { char* name; int age; } struct woman { char* name; int age; } man Tom; woman Jane; Jane = Tom; struct { char* name; int age; } Tom;

The pointer type 17 In some (old) languages, the pointer has no data type. This is more flexible and may save memory, but is error prone! declare p pointer; declare i integer; declare c, d char; Memory cost becomes less critical, and S/W quality is more important! Thus, in most existing languages, the pointer type is a part of data types. int* p; int i; char c, d; C/C++... p = &i; d = *p; PL/1... p = address of(c);... p = address of(i); d = dereference(p); // Error won't be detected until run time // Error can be detected by the compiler

User defined types 18 Ordinal types The range of possible values can be easily associated with the set of positive integers. i.e., the values are countable. primitive ordinal types in C/C++/Java: char, int, long, boolean(java) Language constructs for user defined ordinal types enum(c/c++/c#), subrange(pascal,ada) The user defined ordinary types are called subtypes, since they are created by restricting existing primitive types. Abstract data types More generalized forms of user defined types Languages provides constructs for encapsulating the representation for a certain data type and the subroutines for the operations for that type. class (Smalltalk/C++/Java), package(ada)

Why do we need subtypes? 19 Primitive types provided by languages are not enough. Why? int day, month; month = 9; // It's OK...but need more... day = -11; // Non sense! Semantic error! may not be caught even at run time How can we capture this semantic error with data types? Users need to restrict the primitive types. subtypes enumerated types (C++, Pascal) C++ Pascal enum day_type {first = 1, second,, thirty_first enum month_type {Jan, Feb,..., Dec // Jan = 0 day_type day; month_type month = Sep; // That's better. More readable. day = 0; // Error detected at compile time! type month_type = (Jan, Feb,..., Dec); subrange type (Pascal) in some case, more compact and flexible subtype day_type is integer range 1..31; day := -11; day := day + 20; // Error still can be detected. // Also it can be used in integer operation. // This may be error. But error can be easily detected at run time enum type for 1..99999?

Subtype example with C++ enum 20 The enum type improves software quality in terms of readability and maintainability. (Recall Note 1) enum Month {Jan = 1, Feb,..., Dec // subtype of int Month m; int n; while (m >= Jun && m <= Aug) // during summer for (n = Jan; n <= Dec; n += 2) // for every odd month cout << enter 1 for January, 2 for February, ; cin >> n; switch (n) { case Jan: case Feb: // enum type variable cannot take integer directly // for each different month Compatibility between primitive types and subtypes superset subset Month m = Mar; int n = m; // OK! Conversion from Month to int analogy n = Jun + 1; // n = 7, indicating July m = n + 1; // must be compiler error: Conversion from int to its subtype m = m + 1; // error why? These two errors are due to ensuring type safety m = (Month) (n + 1); // OK! If users insist type conversion, it must be done so.? always safe

Abstract data types 21 Type Example: Stack Representation Operations interface representation: top operations: push(),pop(),top() implementation representation: linked list head index=0 Index 0 is pointed by the head of this list. So it is designated to be the top of Stack. operations: insert(idx,elem) remove(idx) get(idx) Programming Methodologies

Implementing the ADT Stack w/ class 22 A class defines an ADT (blue print?). (private?) data representation (public?) methods for operations An object is an instance of that ADT. It is created by declaring a variable of the ADT or by dynamic allocation All instances share all their methods, but each one has its own set of data. template <class T> T* LinkedStack<T>::pop() { if (is_empty()) exit(1); // error return L->remove(0); } template <class T> void LinkedStack<T>::push(T& data) { L->add(0,data); } template <class T> class Stack { public: Stack(); void push(t& elem); T* pop(); T& top(); int is_empty(); private: LinearList<T>* L; main() { T* x, y, z; Stack<int>* st = new Stack<int>(); st->push(*x); // insert x to the array st->push(*y); // insert y to the linked list z = st->pop();

Why do we need user defined ADTs? 23 struct Element { ElemType data; Element* next; struct Stack { Element* top; int num_of_elems; main() { Element* d, e; Stack s; s.top = 0; s.num_of_elems = 0;... e = new Element; e->data = data; e->next = 0; s.top = e;... d = s.top; s.top = s.top->next; data = d->data;... if (s.num_of_elems > 0)... } ordinary C code initialize push pop check if it is empty Class Stack { public: Stack(); { initialize } void push(elemtype* data); ElemType* pop(); Boolean is_empty(); private: Element* top; int num_of_elems; main() { Stack s; // internally initialized... // by the constructor s.push(data);... data = s.pop();... if (s.is_empty())... } C++ code with class Stack The ADT Stack hides low level details of its implementation. So in the code, it acts like ordinary types such as int or char. Thus the Stack object can be treated in the same way as the objects of other types. Consequently, the resulting code has better readability and maintainability. Every implementation detail (i.e, linked list) is exposed w/o ADT Stack.

24 Topics Definition of a type Kinds of types Type binding and checking Type conversion Polymorphism

Type checking 25 Recall data type = set of data items + set of operators A data item is compatible with an operator if it can be passed to the operator as the operands. int i, j; i * 3 // legal: integer value(= item of int type) is compatible with * i * eesnu // illegal: string (of char[] type) must not be compatible with * Σ(1.3, 3.01, 2.0) // legal Σ(3.2, j, i) // illegal in principle (but in reality it can be avoided ex: coercion) Type error occurs if an operator is applied to incompatible items. A program is type safe if it results in no type error while being executed. Type checking is the activity of ensuring that a program is type safe.

Static vs. dynamic type binding 26 In static type binding, a variable is bound to a certain type by a declaration statement, and should have only one type during its life time. float x; char* x; // x is of a real type // This is an error most existing languages such as Fortran, PL/1, C/C++ and ML In dynamic type binding, a variable is bound to a type when it is assigned a value during program execution, and can be bound to as many types as possible. > (define x 4.5) // x is of a real type > (define x '(a b c)) // now, x is of a list type Scheme, LISP, APL, SNOBOL, virtual functions in C++

Static type checking 27 Type checking performed during compile time Pascal, Fortran, C/C++, Ada, ML, The type of an expression is determined by static program analysis. To support static type checking in a language, a variable (or memory location) and a procedure must hold only one type of values, and this type must be statically bound or inferred. Pascal C++ var x : real; w : array of [1..10] of real; function foo(n : integer): real... begin w[9] := foo(5) / w[1]; w[10] := foo(x) + 3.4; #include <stream.h> main() { int i = bar(); // OK // error // error: undefined function bar

Dynamic type checking 28 type checking performed during program execution required by languages that perform dynamic type binding, or class Employee {... virtual void print() = 0; // pure virtual class Researcher: public Employee {... virtual void print() {... } class Secretary: public Employee {... virtual void print() {... }... Employee* p; if () p = new Secretary else p = new Researcher; p->print(); // which print() is called is determined at run time check the value of a program variable at run time. enum Month {Jan = 1, Feb,..., Dec Month m; int n; m = (Month)(n * 2); // no compiler error, but is 1 n 6?

Strongly vs. weakly typed languages 29 strongly typed (Java, Ada, ML, Pascal) if (almost) all programs are guaranteed to be type safe by static/dynamic type checking J2SE Ver.5 weakly typed or untyped (Fortran, C/C++, Scheme, LISP) C++ float foo(char cc, float x) { cout << cc << x; } main() { float x = foo(100.7,'c'); // it runs! output: d 99 Fortran enum Month = {Jan, Feb,, Dec Month m = Feb; int x; boolean b; x = m; // Java discourages this conversion, although C++ allows it while (x < 100) // OK if (x++) // error if (b) // OK if (x++) // OK: boolean true if y 0 real r char(100.7) char(100) d character c float( c ) 99.0 equivalence (r,c) print*, r; // maybe wrong, but maybe still OK

Overloading 30 Often it is more convenient to use the same symbol/operator to denote several values or operations of different types. Pascal subtype day_type = 1..31 The numbers 1 ~ 31 are overloaded because the numeric symbols of type day are also of type integer in Pascal. C++ int ::operator+(int, int) {... } float ::operator+(float, float) {... } This built in symbol + is overload because it is used for the addition for integer and real types. In C++, users can overload operators with the class construct. class complex {... complex operator+(complex, complex); }

Overloading 31 Type checking tries to resolve ambiguities in an overloaded symbol from the context of its appearance. float foo(int x) { } void foo(char* y, HerType z) { } main () { enum Month = {Jan, Feb,, Dec int a, b; Month m; 4.3 + 1.3 // float addition a + b // integer addition foo(a) // foo(int x) 3.46 + 2 // float addition??? m + 1 // integer addition??? foo(a,b,m) // foo(int,int,month)??? If the ambiguity cannot be resolved, type error occurs. float foo(int x) { // code for this foo } void foo(char* y, HerType z) { // code for this foo } float ::operator+() { // code for float add } int ::operator+() { // code for integer add }

Type conversion 32 In order to allow 3.46 + 2 instead of 3.46 + 2.0, one solution is to create extra two overloaded functions float ::operator+(float, int) {... } float ::operator+(int, float) {... } But, this solution is tedious and may cause exponential explosion of the overloaded functions for each possible combination of types such as short, int, long, float, double, unsigned, A better solution: type conversion convert the types of operands. Two alternatives for type conversion explicit: type cast implicit: coercion

Type cast 33 Explicit type conversion enum Degree = {LOW = 0, MID = 10, HIGH = 100 float x = 3.46 + (float) 2; int *ptr = (int *) 0xffffff; Degree d = MID; x = x + (float) *ptr; *ptr = 5 * (int) d; Drawback of type cast Heedless explicit conversion may invoke information loss. (e.g. truncation) enum Degree = {LOW = 0, MID = 10, HIGH = 100 float x = 3.49; int n = (float) x; // no error, but 0.49 is truncated Degree d = (Degree) n; // no error, but semantically incorrect (no valid Degree value) A solution? implicit type conversion (coercion)! Languages provide coercion to coerce the type of some of the arguments in a direction that has preferably no information loss.

Coercion 34 is the rule in most languages (PL/1, COBOL, Algol68, C, Java). provides a predefined set of implicit coercion precedences. Generally, a type is widened when it is coerced. C/Java character int pointer int int float float double Convertion table (D: double, F: float, I: integer, L: long) CalculationTypes Result type Stored in variable of type divide operation x = 5.0/3 D/I D D double ::opeator/ y = 5/3.0F I/F F F or D float ::opeator/ z = 5/3 I/I I I L F or D integer ::opeator/ v = 5/3.0 I/D D D double ::opeator/ A constant like 3 is double by default.

Coercion 35 Coercion may still suffer information loss. Ex: 32 bit integer 32 bit float with 23 bit mantissa Format for a 32 bit floating point number (IEEE standard 754 1985) Value = ±1.f 2 e 127 (exponent a biased sign number) 32 bits = 1 (sign) + 8 (exponent) + 23 (fraction) 11000001111100000000000000000000 1.875 2 4 So this is safe to coerce an int constant to double. (ex: 5/3.0) The generous coercion rules make typing less strict, thereby possibly causing run time overhead (e.g., COBOL), making code generation more complicated, and in particular, making security that typing provides lost by masking serious programming errors. For the last reason, some strongly typed languages (Ada, Pascal) has almost no coercion rules. (but, possibly due to compatibility with C++, Java allows the same coercion rules as C++)

Monomorphic/polymorphic objects 36 A monomorphic object (function, variable, constant, ) has a single type. constants of simple types (character/integer/real): a, 1, 2.34, variables of simple types: int i; (C), x :real; (Pascal) various user defined functions: int foo(char* c); A polymorphic (generic) object has more than one types. the constant nil in Pascal and 0(integer,virtual function, pointer) in C basic operators for int and float: +,, :=, ==, <, >, /, *(multiply, dereference), functions with the same name but with different argument lists: foo(int i), foo(char c, int x) subtype objects subrange types a base class pointer referencing its derived class objects in OOP virtual functions in OOP

Polymorphic functions 37 1. Ad hoc polymorphic functions that work on a finite number of types overloaded functions built in +, *, user defined int foo(int i); float foo(char c); functions with parameter coercion Ex: convert real + int to real + real After the ambiguity is resolved, a different piece of code is used. float f (char) { } int f (int) { } int i, j; float x, y; x = foo( t ); y = 3.2 + x j = foo(i + 3); code for float addition code for integer addition

38 Polymorphic functions 2. Universal polymorphic functions that work on an unlimited numbers of types inclusion polymorphism: an object can be viewed as belonging to many different classes that need not be disjoint; that is, there may be inclusion of classes. subtypes, derived classes in C++/Java parametric polymorphism: a polymorphic function has an implicit or explicit type parameter which determines the type of the argument for each application of that function. * (dereference), template in C++. Cf: Java does not support parametric polymorphism Typically, the same code is used regardless of the types of the parameters, and the functions exploit a common structure among different types. The template function foo<>() defines the common code to be used with the template parameter T. The dereference operator * returns the value stored at the address where its input argument points. type type 3 type 2 1 object object + param 21 type 1 type 2 template <class T> foo(t& x) {

Parametric polymorphism in C++ 39 class SNU { public: void f() { } class EE { public: void f() { } Original Code template <class T> void foo(t& x) { x.f(); main() { SNU s; EE e; The template function foo takes as its parameters not only variable x but also type T. Here, T is called a type variable. } foo(s); foo(e); 1999, U. Eisenecker

Inclusion polymorphism in C++ 40 class SNU { public: void f() { } class EE : public SNU { public: void f() { } void foo(snu* x) { x->f(); main() { SNU s; EE e; foo(&s); foo(&e); } 1999, U. Eisenecker

Overloading in C++ 41 class SNU { public: void f() { } class EE { public: void f() { } void foo(snu& x) { x.f(); void foo(ee& x) { x.f(); main() { SNU s; EE e; foo(s); foo(e); } 1999, U. Eisenecker

Coercion in C++ 42 class SNU { public: void f() { } class EE { public: void f() { } operator SNU() { } // type conversion operator Without this, we will have an error! void foo(const SNU& x) { x.f(); main() { SNU s; EE e; foo(s); foo(e); } e changes to s, so this code is not equivalent to the original code 1999, U. Eisenecker

Coercion in C++ 43 class EE { public: void f() { } class SNU { public: SNU(EE&) { } SNU() { } void f() { } operator SNU() { } // type conversion constructor // ordinary constructor void foo(const SNU& x) { x.f(); e changes to s, so this code is not equivalent to the original code } main() { SNU s; EE e; foo(s); foo(e); 1999, U. Eisenecker