Outline 2017/03/17. (sections from

Similar documents
Polymorphism Part 1 1

AN OVERVIEW OF C++ 1

Distributed Real-Time Control Systems. Lecture 14 Intro to C++ Part III

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

Object Oriented Programming. Assistant Lecture Omar Al Khayat 2 nd Year

Distributed Real-Time Control Systems. Lecture 17 C++ Programming Intro to C++ Objects and Classes

Abstraction in Software Development

Lecture 14: more class, C++ streams

Fast Introduction to Object Oriented Programming and C++

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

PIC 10A Objects/Classes

CSE 303: Concepts and Tools for Software Development

CE221 Programming in C++ Part 1 Introduction

Modern C++ for Computer Vision and Image Processing. Igor Bogoslavskyi

Introduction to C++ (Extensions to C)

Inheritance, and Polymorphism.

Distributed Real-Time Control Systems. Chapter 13 C++ Class Hierarchies

EL2310 Scientific Programming

CS24 Week 3 Lecture 1

CSc 328, Spring 2004 Final Examination May 12, 2004

Government Polytechnic, Muzaffarpur. Name of the Lab: OBJECT ORIENTED PROGRAMMING

Function Overloading

Object-Oriented Programming

CSE 374 Programming Concepts & Tools. Hal Perkins Spring 2010

Review: C++ Basic Concepts. Dr. Yingwu Zhu

Implementing an ADT with a Class

Object Oriented Design

CS11 Intro C++ Spring 2018 Lecture 1

CS3157: Advanced Programming. Outline

CS304 Object Oriented Programming Final Term

C++ Memory Map. A pointer is a variable that holds a memory address, usually the location of another variable in memory.

Introduction to Classes

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

The mechanism that allows us to extend the definition of a class without making any physical changes to the existing class is called inheritance.

Class Destructors constant member functions

G52CPP C++ Programming Lecture 13

Lecture 2, September 4

Short Notes of CS201

CS201 - Introduction to Programming Glossary By

Midterm Exam 5 April 20, 2015

Object-Oriented Programming in C++

Friend Functions, Inheritance

CSI33 Data Structures

Lecture 7. Log into Linux New documents posted to course webpage

C++ 8. Constructors and Destructors

Lecture 8: Object-Oriented Programming (OOP) EE3490E: Programming S1 2017/2018 Dr. Đào Trung Kiên Hanoi Univ. of Science and Technology

CSE 374 Programming Concepts & Tools. Hal Perkins Fall 2015 Lecture 19 Introduction to C++

Introduction to Programming session 24

CS 376b Computer Vision

Lab 2: ADT Design & Implementation

Classes - 2. Data Processing Course, I. Hrivnacova, IPN Orsay

the gamedesigninitiative at cornell university Lecture 7 C++ Overview

COMSW Introduction to Computer Programming in C

CS11 Introduction to C++ Fall Lecture 1

Interview Questions of C++

More C++ : Vectors, Classes, Inheritance, Templates

File I/O Christian Schumacher, Info1 D-MAVT 2013

OBJECT ORIENTED PROGRAMMING USING C++

Chapter 13: Introduction to Classes Procedural and Object-Oriented Programming

More C++ : Vectors, Classes, Inheritance, Templates. with content from cplusplus.com, codeguru.com

C++_ MARKS 40 MIN

ECE 3574: Dynamic Polymorphism using Inheritance

Agenda. The main body and cout. Fundamental data types. Declarations and definitions. Control structures

3.Constructors and Destructors. Develop cpp program to implement constructor and destructor.

#include <iostream> #include <cstdlib>

A brief introduction to C++

Data Structures using OOP C++ Lecture 3

Partha Sarathi Mandal

Reference Parameters A reference parameter is an alias for its corresponding argument in the function call. Use the ampersand (&) to indicate that

CS

Recharge (int, int, int); //constructor declared void disply();

SRM ARTS AND SCIENCE COLLEGE SRM NAGAR, KATTANKULATHUR

Introduction Of Classes ( OOPS )

Reliable C++ development - session 1: From C to C++ (and some C++ features)

CS 6456 OBJCET ORIENTED PROGRAMMING IV SEMESTER/EEE

CPS 506 Comparative Programming Languages. Programming Language

Intermediate Programming, Spring 2017*

Extending Classes (contd.) (Chapter 15) Questions:

And Even More and More C++ Fundamentals of Computer Science

Programming, numerics and optimization

Jayaram college of Engineering and Technology, Pagalavadi. CS2203 Object Oriented Programming Question Bank Prepared By: S.Gopalakrishnan, Lecturer/IT

Computational Physics

Extending Classes (contd.) (Chapter 15) Questions:

GEA 2017, Week 4. February 21, 2017

III. Classes (Chap. 3)

C++ Quick Guide. Advertisements

C++ basics Getting started with, and Data Types.

Chapter 9 Objects and Classes. Liang, Introduction to C++ Programming, (c) 2007 Pearson Education, Inc. All rights reserved.

6.096 Introduction to C++ January (IAP) 2009

G52CPP C++ Programming Lecture 14. Dr Jason Atkin

EL2310 Scientific Programming

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

CS 162, Lecture 25: Exam II Review. 30 May 2018

Topics. Topics (Continued) 7.1 Abstract Data Types. Abstraction and Data Types. 7.2 Object-Oriented Programming

CSCE 110 PROGRAMMING FUNDAMENTALS

Outline. 1 Function calls and parameter passing. 2 Pointers, arrays, and references. 5 Declarations, scope, and lifetimes 6 I/O

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

G52CPP C++ Programming Lecture 17

2. It is possible for a structure variable to be a member of another structure variable.

Cpt S 122 Data Structures. Introduction to C++ Part II

Transcription:

Outline 2017/03/17 clarifications I/O basic namespaces and structures (recall) Object Oriented programming (8.1) Classes (8.2 8.6) public, protected and private Constructors and destructors Getters and setters Example public, protected and private Constructors and destructors Getters and setters compilation how to Giving life to classes: Overloading (7.6), Inheritance (11), and Polymorphism (12) (sections from http://www.learncpp.com) Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 222

Last time examples and exercises Download, look, compile, and run: hello.cpp, typessize.cpp, pointers.cpp, morefunctions.cpp, morefunctions2.cpp, morefunctions3.cpp, morefunctionswrong.cpp, constdeclarations.cpp, strings.cpp write a program which calculates the area of a given trapezoid and print the result on the STDOUT change it in order to accept as input from the command line three numbers - minor basis, major basis and height of a trapezoid: bash>./area 1. 2. 3. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 223

I/O basics Input/Output operations on files are handled by the fstream class by C++ in a similar way the iostream class handles the STDIN and STDOUT. In physics most of I/O pass through ROOT classes, as we will see in future lessons. Input from text files using C++ is however needed in some lab courses. http://www.cplusplus.com/reference/iostream/fstream/ Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 224

io.cpp: I/O basics #include <iostream> #include <fstream> using namespace std; int main(){ ifstream in; // declare an object called in needed to handle files in.open("mydata.dat"); // use the open function to open the file float a1,a2,a3,a4,t1,t2,t3,t4; // called mydata.dat int nlines = 0; bool forever = true; while ( forever ) { // loop forever, or until the file ends in >> a1 >> a2 >> a3 >> a4 >> t1 >> t2 >> t3 >> t4; // read the file if (!in.good() ) break; // alias for if ( in.good() == 0 ) break; if (nlines < 5) cout << a1 << " " << a2 << " " << a3 << << a4 << " " << t1 << " " << t2 << " << t3 << " " << t4 << endl; // NOTICE endl = endline ~same as \n nlines++; cout << " found " << nlines << " points \n"; in.close(); return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 225

Namespaces Namespace: a namespace is a container for a set of identifiers (names), and allows the disambiguation of homonym identifiers residing in different namespaces. Namespaces usually group names based on their functionality. Example (not C++): Identifier Namespace identifier Local name /home/user/readme.txt /home/user (path) readme.txt (filename) Example: you have default sin function which accept radians values as input; now you want to create a sin function which accepts degrees as input but you want still to be able to use the radians version. You could create a function sindegrees but a cleaner way is to define a namespace where sin function accepts radians and a different namespace where sin function accepts degrees, being able to choose at will which of the namespace to use. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 226

Namespaces How to use a namespace in your program? by using the scope operator :: NAMESPACE_NAME::localname std::cout<< using cout from namespace std \n ; How to change namespace in a block or globally? using namespace NAMESPACE_NAME; using namespace std; cout << std:: is used by default \n ; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 227

Structures C++ allows us to create our own user-defined aggregate data types. An aggregate data type is a data type that groups multiple individual variables together. One of the simplest aggregate data type is the structure. A structure allows us to group variables of mixed data types together into a single unit. How to define a structure: struct NAME { typea variable1; typeb variable2; ; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 228

Structures How to use a structure in the program: struct Trapezium { float minorbasis; float majorbasis; float height; bool isisosceles; ; int main(){... Trapezium mytrapezium; mytrapezium.minorbasis = 6.; mytrapezium.majorbasis = 8.; mytrapezium.height = 5; mytrapezium.isisosceles = true;... Trapezium yourtrapezium; yourtrapezium.isisosceles = true;... Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 229

Structures How to use a structure in the program (heap memory example): struct Trapezium { float minorbasis; float majorbasis; float height; bool isisosceles; ; int main(){... Trapezium *mytrapezium = new Trapezium(); mytrapezium->minorbasis = 6.; mytrapezium->majorbasis = 8.; mytrapezium->height = 5; mytrapezium->isisosceles = true;... delete mytrapezium;... Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 230

Object-Oriented (OO) programming Non-structured program Procedural program main program main program procedure1 procedure3 procedure2 Modular program main program data module 2 Object Oriented program object 1 object 3 module 1 procedure1 procedure2 procedure3 object 2 object 4 Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 231

Object-Oriented concepts What is object-oriented programming? Take a look around you, everywhere you look are objects. Most objects have two major components to them: 1) a list of properties (eg. weight, color, size, texture, shape, etc ). 2) Some number of actions that either they can perform, or that can be performed on them (e.g. being opened, having something poured into it, etc ). These two components are inseparable. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 232

Object-Oriented concepts With traditional programming, the properties (data) and actions (functions) are separate entities not a very intuitive representation of reality. We are intuitively used to thinking about things as objects, and expect to be able to perform actions with/on those objects. Object-oriented programming provides us with the ability to design objects that have both characteristics (sometimes called attributes, fields, or properties) and behaviors (methods or features), all tied together in one package. This allows programs to be written in a more modular fashion, which makes them easier to write and understand, and also provides a higher degree of codereusability. Objects provide a more intuitive way to work with our data by allowing us to define how we interact with the objects, and how they interact with other objects. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 233

Object-Oriented concepts Class: part of the system, it describes something Object: class declaration in the program Class member: something owned by the class (property) Method: function of the class, it describes what the class can do (action) When we use a class in a program we write a declaration to use it: this is called instantiating the class. The variable used in the declaration is called an instance of the class or an object. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 234

Defining a class, syntax A class can contain members and functions of any type, class is like an extended structure: class polygon { typea variable1; typeb function(typec); protected: typea variable2; ; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 235

Defining a class Members and methods of a class are available everywhere in the class implementation, class acts like a namespace: class polygon { typea variable1; typeb function(typec); ; typeb polygon::function(typec myvar){ typea localvar = sin(variable1);... Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 236

Headers and implementations When we have a class we usually want it to be used by more than a single program, we want to make a library out of it. We will need to split our code. Usually the header file: classname.h will contain the class declaration, the members and methods definition. The implementation file: classname.cpp will contain the implementation of the methods of the class, how the object is contructed and destructed, what the methods are doing, etc. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 237

Headers and implementations Eventually a shared library will be created (.so file). In the user program to be able to use our class we will need to: 1) add the header file; 2) link the shared library when compiling. class polygon { typea variable1; typeb function(typec); ; typeb polygon::function(typec myvar){ typea localvar = sin(variable1);... Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 238

Headers and implementations Eventually a shared library will be created (.so file). In the user program to be able to use our class we will need to: 1) add the header file; 2) link the shared library when compiling. class polygon { typea variable1; FILE polygon.h typeb function(typec); ; typeb polygon::function(typec myvar){ typea localvar = sin(variable1);... FILE polygon.cpp Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 239

Class definition, the three levels of data hiding public, protected and are access modifiers and help us implement information hiding. They tell the compiler which other classes should have access to the fields or methods being defined: public - Any class can refer to the members or call the methods. protected - Only the current class and subclasses (class daughters) of this class will have access to the members or methods. private - Only the current class will have access to the members or methods. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 240

Class definition, three levels of data hiding: example public protected private the garden, table, seats outside this building anybody can use them rooms inside this building only friends can use it our colleagues, people that has to do with Physics Departement this computing room only us are authorized to use it in this moment Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 241

Class definition, three levels of data hiding: protected seldom used public protected private the garden, table, seats outside this building anybody can use them rooms inside this building only friends can use it our colleagues, people that has to do with Physics Departement this computing room only us are authorized to use it in this moment Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 242

Class definition, three levels of data hiding: example II public protected variables and methods that can be accessed directly in our program (myprogram.cpp) variables and methods than can be accessed by sub-classes private variables and methods that can be accessed only inside the declaration and implementation of the class (polygon.h and polygon.cpp) Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 243

Constructors and Destructors constructors and destructors are special methods of a class: they are automatically called when the object come to life (constructor) and die (destructor) Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 244

Constructor usage The constructor is used to: allocate memory needed by the class initialize data fields (when and if needed) The constructor returns an object of the class type. The constructor name must be equal to its class name. The constructor can accept input arguments. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 245

Destructor usage The destructor is used to: de-allocate memory used by the class must call a delete for any new defined in the constructor or by class methods The destructor returns void. The destructor name must be equal to its class name prefixed by a tilde symbol: ~. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 246

Getters and Setters: definition Getters and Setters are public methods of a class used to access private members instead of using public members Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 247

Getters: how to In the declaration: int a; int GetA(); int _a; in the implementation: int MyClass::GetA(){ return _a; in the main program: int m=myclass->a; int m=myclass->geta(); Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 248

Setters: how to In the declaration: int a; void SetA(int value); int _a; in the implementation: void MyClass::SetA(int value){ _a = value; in the main program: MyClass->a = 10; MyClass->SetA(10); Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 249

Getters and Setters: why? Getters and Setters: hide class members to the rest of the world (less prone to introduce bugs); allow internal management to be changed without needs in changing the application programs; you can perform validation; can allow different access levels to the same variable, for example GetA() can be public while SetA() can be private. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 250

How to arrange files to write a class When we have a class we usually want it to be used by more than a single program, we want to make a library out of it. We will need to split our code. Usually the header file: classname.h will contain the class declaration, the members and methods definition. The implementation file: classname.cpp will contain the implementation of the methods of the class, how the object is contructed and destructed, what the methods are doing, etc. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 251

What to do to use a class Eventually a shared library will be created (.so file). In the user program to be able to use our class we will need to: 1) add the header file in the source code; 2) instantiate and use the object in the source code; 3) link the shared library when compiling; 4) tell the executable where to find the library at run time. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 252

At least working on 3 source files class Polygon { typea variable1; FILE polygon.h typeb function(typec); ; typeb Polygon::function(typeC myvar){ typea localvar = sin(variable1);... FILE polygon.cpp #include <polygon.h> int main(){ typec perimeter; Polygon *trapezium = new Polygon(); trapezium->function(perimeter); return 0; FILE myprogram.cpp class header file class implementation file program file Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 253

At least working on 3 source files class Polygon { typea variable1; FILE polygon.h typeb function(typec); ; typeb Polygon::function(typeC myvar){ typea localvar = sin(variable1);... FILE polygon.cpp #include <polygon.h> int main(){ typec perimeter; Polygon *trapezium = new Polygon(); trapezium->function(perimeter); return 0; FILE myprogram.cpp what the object is made of and what it can do how the object does things object final usage Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 254

Building a class, example: header,.h file implementation,.cpp file user program,.cpp file Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 255

Building a class, trapezium example: trapezium.h file trapezium.cpp file classtest.cpp file #ifndef TRAPEZIUM_H #define TRAPEZIUM_H #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 256

Building a class, trapezium example: trapezium.h file trapezium.cpp file classtest.cpp file #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 257

Building a class, trapezium example: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ trapezium.h file trapezium.cpp file classtest.cpp file #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); ; delete t; return 0; #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 258

Building a class, trapezium example: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; Trapezium(); trapezium.h file trapezium.cpp file classtest.cpp file #include <trapezium.h> Trapezium::Trapezium(){ #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); delete t; return 0; #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 259

Building a class, trapezium example: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ Trapezium(); trapezium.h file trapezium.cpp file classtest.cpp file float _majoraxis; float _minoraxis; float _height; #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); delete t; return 0; ; #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 260

Building a class, trapezium example: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; Trapezium(); trapezium.h file trapezium.cpp file classtest.cpp file float _majoraxis; float _minoraxis; float _height; #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->_majoraxis << delete t; return 0; #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 261

Building a class, trapezium example: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; Trapezium(); trapezium.h file trapezium.cpp file classtest.cpp file float _majoraxis; float _minoraxis; float _height; #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->_majoraxis << delete t; return 0; #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 262

Building a class, trapezium example: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ trapezium.h file trapezium.cpp file classtest.cpp file Trapezium(); float GetMajorAxis(); float _majoraxis; float _minoraxis; float _height; #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ return _majoraxis; #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << delete t; return 0; ; #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 263

Building a class, trapezium example: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; trapezium.h file trapezium.cpp file classtest.cpp file Trapezium(); float GetMajorAxis(); float GetMinorAxis(); float GetHeight(); float _majoraxis; float _minoraxis; float _height; #endif // TRAPEZIUM_H #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ return _majoraxis; float Trapezium::GetMinorAxis(){ return _minoraxis; float Trapezium::GetHeight(){ return _height; #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 264

Building a class, trapezium example: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ trapezium.h file trapezium.cpp file classtest.cpp file Trapezium(); float GetMajorAxis(); float GetMinorAxis(); float GetHeight(); float _majoraxis; float _minoraxis; float _height; #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ return _majoraxis; float Trapezium::GetMinorAxis(){ return _minoraxis; #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << t->_majoraxis = 10.; ; #endif // TRAPEZIUM_H float Trapezium::GetHeight(){ return _height; delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 265

Building a class, trapezium example: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ trapezium.h file trapezium.cpp file classtest.cpp file Trapezium(); float GetMajorAxis(); float GetMinorAxis(); float GetHeight(); float _majoraxis; float _minoraxis; float _height; #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ return _majoraxis; float Trapezium::GetMinorAxis(){ return _minoraxis; #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << t->_majoraxis = 10.; ; #endif // TRAPEZIUM_H float Trapezium::GetHeight(){ return _height; delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 266

Building a class, trapezium example: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; trapezium.h file trapezium.cpp file classtest.cpp file Trapezium(); float GetMajorAxis(); float GetMinorAxis(); float GetHeight(); void SetMajorAxis(float cm); float _majoraxis; float _minoraxis; float _height; #endif // TRAPEZIUM_H #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ return _majoraxis; void Trapezium::SetMajorAxis(float cm){ _majoraxis = cm; float Trapezium::GetMinorAxis(){ return _minoraxis; float Trapezium::GetHeight(){ return _height; #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 267

Building a class, trapezium example: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; trapezium.h file trapezium.cpp file classtest.cpp file Trapezium(); float GetMajorAxis(); float GetMinorAxis(); float GetHeight(); void SetMajorAxis(float cm); void SetMinorAxis(float cm); void SetHeight(float cm); float _majoraxis; float _minoraxis; float _height; #endif // TRAPEZIUM_H #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ return _majoraxis; void Trapezium::SetMajorAxis(float cm){ _majoraxis = cm; float Trapezium::GetMinorAxis(){ return _minoraxis; void Trapezium::SetMinorAxis(float cm){ _minoraxis = cm; #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << t->setmajoraxis(10.); t->setminoraxis(4.); t->setheight(2.); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << float Trapezium::GetHeight(){ return _height; delete t; return 0; void Trapezium::SetHeight(float cm){ _height = cm; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 268

Classes as namespaces: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ trapezium.h file Trapezium(); float GetMajorAxis(); float _majoraxis; float _minoraxis; float _height; trapezium.cpp file #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ return _majoraxis; ; #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 269

Classes as namespaces: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ trapezium.h file Trapezium(); float GetMajorAxis(); int var1; float _majoraxis; float _minoraxis; float _height; trapezium.cpp file #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ return _majoraxis; ; #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 270

Classes as namespaces: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ trapezium.h file Trapezium(); float GetMajorAxis(); int var1; float _majoraxis; float _minoraxis; float _height; trapezium.cpp file #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ if ( var1 < 5 )... return _majoraxis; ; #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 271

Classes as namespaces: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; trapezium.h file Trapezium(); float GetMajorAxis(); int var1; float _majoraxis; float _minoraxis; float _height; int _var2; trapezium.cpp file #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ if ( var1 < 5 )... if ( _var2 > 15 )... return _majoraxis; #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 272

Classes as namespaces: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; trapezium.h file Trapezium(); float GetMajorAxis(); int var1; void method1(); float _majoraxis; float _minoraxis; float _height; int _var2; void _method2(); #endif // TRAPEZIUM_H #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ if ( var1 < 5 )... if ( _var2 > 15 )... method1(); trapezium.cpp file... _method2(); return _majoraxis; void Trapezium::method1(){...... void Trapezium::_method2(){...... Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 273

The «this» operator #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; trapezium.h file Trapezium(); float GetMajorAxis(); int var1; void method1(); float _majoraxis; float _minoraxis; float _height; int _var2; void _method2(); #endif // TRAPEZIUM_H #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ if ( this->var1 < 5 )... if ( this->_var2 > 15 )... this->method1(); trapezium.cpp file... this->_method2(); return _majoraxis; void Trapezium::method1(){...... Operator this : the this pointer is an implicit parameter to all member variables and methods. Therefore, inside a member method, this may be used to refer to the invoking object. void Trapezium::_method2(){...... http://en.cppreference.com/w/cpp/language/this Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 274

Classes: inline methods #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ trapezium.h file Trapezium(); float GetMajorAxis(); float _majoraxis; float _minoraxis; float _height; trapezium.cpp file #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ return _majoraxis; ; #endif // TRAPEZIUM_H http://www.cplusplus.com/articles/2lywvcm9/ Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 275

Classes: inline methods #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ Trapezium(); trapezium.h file float GetMajorAxis(){return _majoraxis;; trapezium.cpp file #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float _majoraxis; float _minoraxis; float _height; ; #endif // TRAPEZIUM_H http://www.cplusplus.com/articles/2lywvcm9/ Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 276

Classes: inline methods #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ trapezium.h file Trapezium(); inline float GetMajorAxis(){return _majoraxis;; trapezium.cpp file #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float _majoraxis; float _minoraxis; float _height; ; #endif // TRAPEZIUM_H http://www.cplusplus.com/articles/2lywvcm9/ Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 277

Code compilation: how to 1. create the shared library containing the class: I. create the class object g++ -Wall -fpic I./ -c trapezium.cpp -o trapezium.o issue all compilation warnings search for headers files in the directory./ (this directory) position independent code (necessary for so libs) http://tldp.org/howto/program-library-howto/shared-libraries.html Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 278

Code compilation: how to 1. create the shared library containing the class: I. create the class object g++ -Wall -fpic I./ -c trapezium.cpp -o trapezium.o II. create the shared object g++ -Wall -shared -o libtrapezium.so trapezium.o create a shared library name MUST start with lib http://tldp.org/howto/program-library-howto/shared-libraries.html Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 279

Code compilation: how to 2. create the main program executable: III. create the program object g++ -Wall -c classtest.cpp -I./ -o classtest.o search for headers files in the directory./ (this directory) Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 280

Code compilation: how to 2. create the main program executable: III. create the program object g++ -Wall -c classtest.cpp -I./ -o classtest.o IV. create the executable g++ -Wall -o classtest classtest.o -L./ -ltrapezium search for libraries files in the directory./ (this directory) NB: for compilation only! this program will need a shared library called libtrapezium.so Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 281

Code compilation: summary >ls trapezium.cpp trapezium.h classtest.cpp >g++ -Wall -fpic -c trapezium.cpp -I./ -o trapezium.o >g++ -Wall -shared -o libtrapezium.so trapezium.o >g++ -Wall -c classtest.cpp -I./ -o classtest.o >g++ -Wall -o classtest classtest.o -L./ -ltrapezium >ls trapezium.cpp trapezium.h classtest.cpp trapezium.o libtrapezium.so classtest.o classtest Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 282

Running the executable: how to >ls trapezium.cpp trapezium.h classtest.cpp trapezium.o libtrapezium.so classtest.o classtest >./classtest./classtest: error while loading shared libraries: libtrapezium.so: cannot open shared object file: No such file or directory >export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH >./classtest A = 0 a = 0 h = 0 A = 10 a = 4 h = 2 > Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 283

Overloading Overloading: two (or more) methods (or functions or operators like +, -, ==,...]) with the same name but accepting different parameter(s) are seen as different methods (functions or operators) by the compiler void Print(); void Print(float a); void Print(int b); Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 284

Overloading void Print(){ cout << hello! \n ; void Print(float a){ cout << Float: << a << \n ; void Print(int b){ cout << Int: << b << \n ; int main (){ Print(); Print(5.); Print(5); return 0; hello! Float: 5 Int: 5 Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 285

Building a class, trapezium example: #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; trapezium.h file trapezium.cpp file classtest.cpp file Trapezium(); float GetMajorAxis(); float GetMinorAxis(); float GetHeight(); void SetMajorAxis(float cm); void SetMinorAxis(float cm); void SetHeight(float cm); float _majoraxis; float _minoraxis; float _height; #endif // TRAPEZIUM_H #include <trapezium.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; float Trapezium::GetMajorAxis(){ return _majoraxis; void Trapezium::SetMajorAxis(float cm){ _majoraxis = cm; float Trapezium::GetMinorAxis(){ return _minoraxis; void Trapezium::SetMinorAxis(float cm){ _minoraxis = cm; #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << t->setmajoraxis(10.); t->setminoraxis(4.); t->setheight(2.); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << float Trapezium::GetHeight(){ return _height; delete t; return 0; void Trapezium::SetHeight(float cm){ _height = cm; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 286

Trapezium example: constructor overloading #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; TrapeziumO.h file TrapeziumO.cpp file classtesto.cpp file Trapezium(); Trapezium(float minor, float major, float height); float GetMajorAxis(); float GetMinorAxis(); float GetHeight(); void SetMajorAxis(float cm); void SetMinorAxis(float cm); void SetHeight(float cm); float _majoraxis; float _minoraxis; float _height; #endif // TRAPEZIUM_H #include <TrapeziumO.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; Trapezium::Trapezium(float minor, float major, float height){ _majoraxis = major; _minoraxis = minor; _height = height; float Trapezium::GetMajorAxis(){ return _majoraxis; void Trapezium::SetMajorAxis(float cm){ _majoraxis = cm; float Trapezium::GetMinorAxis(){ return _minoraxis; void Trapezium::SetMinorAxis(float cm){ _minoraxis = cm; float Trapezium::GetHeight(){ return _height; void Trapezium::SetHeight(float cm){ _height = cm; #include <iostream> #include <TrapeziumO.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << t->setmajoraxis(10.); t->setminoraxis(4.); t->setheight(2.); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << Trapezium *s= new Trapezium(1.,1.,2.); cout << A = << s->getmajoraxis() << cout << a = << s->getminoraxis() << cout << h = << s->getheight() << \n delete s; delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 287

Trapezium example: constructor overloading #ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; TrapeziumO.h file TrapeziumO.cpp file classtesto.cpp file Trapezium(); Trapezium(float minor, float major, float height); float GetMajorAxis(); float GetMinorAxis(); float GetHeight(); void SetMajorAxis(float cm); void SetMinorAxis(float cm); void SetHeight(float cm); float _majoraxis; float _minoraxis; float _height; #endif // TRAPEZIUM_H #include <TrapeziumO.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; Trapezium::Trapezium(float minor, float major, float height){ SetMajorAxis(major); _minoraxis = minor; _height = height; float Trapezium::GetMajorAxis(){ return _majoraxis; void Trapezium::SetMajorAxis(float cm){ _majoraxis = cm; float Trapezium::GetMinorAxis(){ return _minoraxis; void Trapezium::SetMinorAxis(float cm){ _minoraxis = cm; float Trapezium::GetHeight(){ return _height; void Trapezium::SetHeight(float cm){ _height = cm; #include <iostream> #include <TrapeziumO.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << t->setmajoraxis(10.); t->setminoraxis(4.); t->setheight(2.); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << Trapezium *s= new Trapezium(1.,1.,2.); cout << A = << s->getmajoraxis() << cout << a = << s->getminoraxis() << cout << h = << s->getheight() << \n delete s; delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 288

Inheritance Inheritance: a class can be defined in terms of an older, pre-existing class. This produces a new class (derived or daughter class) having all the functionality of the older class (base or mom class), and additionally defining its own specific functionality. Trapezium Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 289

Inheritance Inheritance: a class can be defined in terms of an older, pre-existing class. This produces a new class (derived or daughter class) having all the functionality of the older class (base or mom class), and additionally defining its own specific functionality. Trapezium Triangle Pentagon Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 290

Inheritance Inheritance: a class can be defined in terms of an older, pre-existing class. This produces a new class (derived or daughter class) having all the functionality of the older class (base or mom class), and additionally defining its own specific functionality. Polygon Trapezium Triangle Pentagon Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 291

Inheritance Inheritance: a class can be defined in terms of an older, pre-existing class. This produces a new class (derived or daughter class) having all the functionality of the older class (base or mom class), and additionally defining its own specific functionality. Polygon circle??? Trapezium Triangle Pentagon Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 292

Inheritance Inheritance: a class can be defined in terms of an older, pre-existing class. This produces a new class (derived or daughter class) having all the functionality of the older class (base or mom class), and additionally defining its own specific functionality. Polygon Elipses Trapezium Triangle Pentagon Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 293

Inheritance Inheritance: a class can be defined in terms of an older, pre-existing class. This produces a new class (derived or daughter class) having all the functionality of the older class (base or mom class), and additionally defining its own specific functionality. Geometrical figures Polygon Elipses Trapezium Triangle Pentagon Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 294

Inheritance Inheritance: a class can be defined in terms of an older, pre-existing class. This produces a new class (derived or daughter class) having all the functionality of the older class (base or mom class), and additionally defining its own specific functionality. area, perimeter,... Geometrical figures number of sides, lenght of radii,... Polygon Elipses Trapezium Triangle Pentagon Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 295

Inheritance Inheritance: a class can be defined in terms of an older, pre-existing class. This produces a new class (derived or daughter class) having all the functionality of the older class (base or mom class), and additionally defining its own specific functionality. class derivedclass : public BaseClass{... Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 296

Inheritance DerivedClass will have full access to all members and method in the public zone of BaseClass it is like copying the BaseClass public code in the DerivedClass public declaration plus the members and methods defined in the DerivedClass class DerivedClass : public BaseClass{... float derivedonlyvariable;// new float Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 297

Multiple inheritance multiple inheritance: a class can have more than one parent! in that case it brings in her public zone all public members and methods of all the parent classes. It is declared this way: class daughter : public Mom, public Dad { class kid: public Mom, public Dad, public Uncle, { area, perimeter,... Colors Geometrical figures number of sides, lenght of radii,... Polygon Elipses Trapezium Triangle Pentagon Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 298

#ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; Trapezium example: inheritance TrapeziumO.h file TrapeziumO.cpp file classtesto.cpp file Trapezium(); Trapezium(float minor, float major, float height); float GetMajorAxis(); float GetMinorAxis(); float GetHeight(); void SetMajorAxis(float cm); void SetMinorAxis(float cm); void SetHeight(float cm); float _majoraxis; float _minoraxis; float _height; #endif // TRAPEZIUM_H #include <TrapeziumO.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; Trapezium::Trapezium(float minor, float major, float height){ _majoraxis = major; _minoraxis = minor; _height = height; float Trapezium::GetMajorAxis(){ return _majoraxis; void Trapezium::SetMajorAxis(float cm){ _majoraxis = cm; float Trapezium::GetMinorAxis(){ return _minoraxis; void Trapezium::SetMinorAxis(float cm){ _minoraxis = cm; float Trapezium::GetHeight(){ return _height; void Trapezium::SetHeight(float cm){ _height = cm; #include <iostream> #include <TrapeziumO.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << t->setmajoraxis(10.); t->setminoraxis(4.); t->setheight(2.); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 299

#ifndef TRAPEZIUM_H #define TRAPEZIUM_H class Trapezium{ ; Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); float _majoraxis; Trapezium example: inheritance TrapeziumO.h file TrapeziumO.cpp file classtesti.cpp file #include <TrapeziumO.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; #include <iostream> #include <TrapeziumO.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << delete t; return 0; #endif // TRAPEZIUM_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 300

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; class Trapezium{ Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file #include <Polygon.h> Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << delete t; return 0; Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); float _majoraxis; ; #endif // POLYGON_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 301

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; class Trapezium{ Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << delete t; return 0; float _majoraxis; ; #endif // POLYGON_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 302

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << delete t; return 0; float _majoraxis; ; #endif // POLYGON_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 303

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << delete t; return 0; float _majoraxis; ; #endif // POLYGON_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 304

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << delete t; return 0; number of sides = 4 float _majoraxis; ; #endif // POLYGON_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 305

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->_nsides << delete t; return 0; float _majoraxis; ; #endif // POLYGON_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 306

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->_nsides << delete t; return 0; float _majoraxis; ; #endif // POLYGON_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 307

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); int GetTrapeziumNsides(); float _majoraxis; ; #endif // POLYGON_H #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); int Trapezium::GetTrapeziumNsides(){ return _nsides; #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 308

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); int GetTrapeziumNsides(); float _majoraxis; ; #endif // POLYGON_H #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); int Trapezium::GetTrapeziumNsides(){ return _nsides; #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 309

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); int GetTrapeziumNsides(); float _majoraxis; ; #endif // POLYGON_H #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); int Trapezium::GetTrapeziumNsides(){ return GetNsides(); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 310

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << delete t; return 0; float _majoraxis; ; #endif // POLYGON_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 311

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << Polygon *p = new Polygon(); cout << number of p-sides = << p->getnsides() << float _majoraxis; ; #endif // POLYGON_H delete p; delete t; return 0; number of sides = 0 Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 312

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << Polygon *p = new Polygon(); cout << number of p-sides = << p->getnsides() << float _majoraxis; cout << number of p-sides = << p->_nsides() << ; #endif // POLYGON_H delete p; delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 313

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << Polygon *p = new Polygon(); cout << number of p-sides = << p->getnsides() << float _majoraxis; cout << number of p-sides = << p->_nsides() << ; #endif // POLYGON_H delete p; delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 314

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << Polygon *p = new Polygon(); cout << number of p-sides = << p->getnsides() << float _majoraxis; cout << p-axis = << p->getmajoraxis() << ; #endif // POLYGON_H delete p; delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 315

#ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Trapezium example: inheritance Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << Polygon *p = new Polygon(); cout << number of p-sides = << p->getnsides() << float _majoraxis; cout << p-axis = << p->getmajoraxis() << ; #endif // POLYGON_H delete p; delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 316

Trapezium example: inheritance, pointing to derived objects #ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << Polygon *p = t; float _majoraxis; ; #endif // POLYGON_H delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 317

Trapezium example: inheritance, pointing to derived objects #ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << Polygon *p = t; cout << number of sides = << p->getnsides() << float _majoraxis; ; #endif // POLYGON_H delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 318

Trapezium example: inheritance, pointing to derived objects #ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << Polygon *p = t; cout << number of sides = << p->getnsides() << float _majoraxis; ; #endif // POLYGON_H delete t; return 0; number of sides = 4 Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 319

Trapezium example: inheritance, pointing to derived objects #ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << Polygon *p = t; cout << number of sides = << p->getnsides() << float _majoraxis; ; #endif // POLYGON_H cout << p-axis = << p->getmajoraxis() << delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 320

Trapezium example: inheritance, pointing to derived objects #ifndef POLYGON_H #define POLYGON_H class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; Polygon.h file Polygon.cpp file classtesti.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <Polygon.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <iostream> #include <Polygon.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << t->setmajoraxis(10.); cout << A = << t->getmajoraxis() << cout << number of sides = << t->getnsides() << Polygon *p = t; cout << number of sides = << p->getnsides() << float _majoraxis; ; #endif // POLYGON_H cout << p-axis = << p->getmajoraxis() << delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 321

Inheritance, pointing to derived objects: Trapezium *t = new Trapezium(); Rectangle *r = new Rectangle(); Triangulum *i = new Triangulum(); Polygon *p[3] = {t,r,i; for (int i=0; i<3; i++){ cout << nsides << p[i]->getnsides(); Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 322

Access to members in public inheritance class A{ int apub; protected: int aprot; int apriv; not members: A: apub http://www.cplusplus.com/doc/tutorial/inheritance/ Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 323

Access to members in public inheritance class A{ int apub; protected: int aprot; int apriv; class B : public A { int bpub; protected: int bprot; int bpriv; not members: A: apub B: apub B: bpub http://www.cplusplus.com/doc/tutorial/inheritance/ Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 324

Access to members in public inheritance class A{ int apub; protected: int aprot; int apriv; class B : public A { int bpub; protected: int bprot; int bpriv; not members: A: apub B: apub B: bpub B: A: apub A: aprot http://www.cplusplus.com/doc/tutorial/inheritance/ Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 325

Access to members in protected inheritance class A{ int apub; protected: int aprot; int apriv; class B : protected A { int bpub; protected: int bprot; int bpriv; not members: A: apub B: apub B: bpub B: A: apub A: aprot http://www.cplusplus.com/doc/tutorial/inheritance/ Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 326

Access to members in private inheritance class A{ int apub; protected: int aprot; int apriv; class B : private A { int bpub; protected: int bprot; int bpriv; not members: A: apub B: apub B: bpub B: A: apub A: aprot http://www.cplusplus.com/doc/tutorial/inheritance/ Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 327

Polymorphism StarTrek: Captain Kirk was in trouble, as usual. He met an extremely beautiful lady who, however, later on changed into a hideous troll. Kirk was quite surprised, but the lady told him: Didn't you know I am a polymorph? Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 328

Polymorphism, towards complex objects with multiple properties Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 329

Polymorphism, same action but different implementation, CUT Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 330

Polymorphism, definition In a programming language that exhibits polymorphism, objects of classes belonging to the same hierarchical tree (i.e. inherited from a common base class) may possess functions bearing the same name, but each having different behaviors. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 331

Polymorphism, definition As an example, let us assume there is a base class named Animals from which the subclasses Horse, Fish and Bird are derived. Let us also assume that the Animals class has a function named Move, which is inherited by all subclasses mentioned. With polymorphism, each subclass may have its own way of implementing the function. So, for example, when the Move function is called in an object of the Horse class, the function might respond by displaying trotting on the screen. On the other hand, when the same function is called in an object of the Fish class, swimming might be displayed on the screen. In the case of a Bird object, it may be flying. In effect, polymorphism trims down the work of the developer because he can now create a sort of general class with all the attributes and behaviors that he envisions for it. When the time comes for the developer to create more specific subclasses with certain unique attributes and behaviors, the developer can simply alter code in the specific portions where the behaviors will differ. All other portions of the code can be left as is. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 332

Polymorphism, why? 1) To be more generic: it is the ability to present the same interface for differing underlying forms, the ability to use the same base object to perform different daughter actions. 2) To implement a protocol: to impose requirements (when the action is declared but not implemented in the base class). Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 333

Polymorphism, same object different actions: Trapezium *t = new Trapezium(); Rectangle *r = new Rectangle(); Triangulum *i = new Triangulum(); Polygon *p[3] = {t,r,i; for (int i=0; i<3; i++){ cout << nsides << p[i]->getnsides(); Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 334

Polymorphism, same object different actions: Trapezium *t = new Trapezium(); Rectangle *r = new Rectangle(); Triangulum *i = new Triangulum(); Polygon *p[3] = {t,r,i; for (int i=0; i<3; i++){ cout << nsides << p[i]->getnsides(); cout << nsides << p[i]->calculatearea(); Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 335

Polymorphism, late binding Polymorphism is implemented using a feature called late binding. It's called that way because the decision which function to call (a base class function or a function of a derived class) cannot be made at compile-time, but is postponed until the program is actually executed: only then it is determined which member function will actually be called. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 336

Polymorphism, early and late binding Binding: is the decision made by the compiler to assign a specific function in the main code to a specific function declaration. void Print(){ cout << hello! \n ; void Print(float a){ cout << Float: << a << \n ; void Print(int b){ cout << Int: << b << \n ; int main (){ Print(); Print(5.); Print(5); return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 337

Polymorphism, early and late binding Early binding: assignment is done at compilation time. void Print(){ cout << hello! \n ; void Print(float a){ cout << Float: << a << \n ; void Print(int b){ cout << Int: << b << \n ; int main (){ Print(); Print(5.); Print(5); return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 338

Example: early binding #ifndef MYCLASS_H #define MYCLASS_H #include <iostream> using namespace std; #include <myclass.h> void Base::process(){ _hello(); #include <myclass.h> int main(){ Base *base = new Base(); class Base{ void process(); void _hello(); void Base::_hello(){ cout << "base hello\n"; base->process(); delete base; return 0; ; #endif // MYCLASS_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 339

Example: early binding #ifndef MYCLASS_H #define MYCLASS_H #include <iostream> using namespace std; #include <myclass.h> void Base::process(){ _hello(); #include <myclass.h> int main(){ Base *base = new Base(); class Base{ void process(); void _hello(); void Base::_hello(){ cout << "base hello\n"; base->process(); delete base; return 0; base hello ; #endif // MYCLASS_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 340

Example: early binding #ifndef MYCLASS_H #define MYCLASS_H #include <iostream> using namespace std; #include <myclass.h> void Base::process(){ _hello(); #include <myclass.h> int main(){ Base *base = new Base(); class Base{ ; void process(); void _hello(); class Derived : public Base{ void Base::_hello(){ cout << "base hello\n"; void Derived::_hello(){ cout << derived hello\n"; base->process(); Derived *derived = new Derived(); derived->process(); delete derived; delete base; return 0; void _hello(); ; #endif // MYCLASS_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 341

Example: early binding #ifndef MYCLASS_H #define MYCLASS_H #include <iostream> using namespace std; #include <myclass.h> void Base::process(){ _hello(); #include <myclass.h> int main(){ Base *base = new Base(); class Base{ ; void process(); void _hello(); class Derived : public Base{ void Base::_hello(){ cout << "base hello\n"; void Derived::_hello(){ cout << derived hello\n"; base->process(); Derived *derived = new Derived(); derived->process(); delete derived; delete base; return 0; base hello void _hello(); ; #endif // MYCLASS_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 342

Example: early binding #ifndef MYCLASS_H #define MYCLASS_H #include <iostream> using namespace std; #include <myclass.h> void Base::process(){ _hello(); #include <myclass.h> int main(){ Base *base = new Base(); class Base{ ; void process(); void _hello(); class Derived : public Base{ ; void _hello(); #endif // MYCLASS_H void Base::_hello(){ cout << "base hello\n"; void Derived::_hello(){ cout << derived hello\n"; base->process(); Derived *derived = new Derived(); derived->process(); delete base; return 0; Derived's author's reasoning was as follows: Base's implementation of _hello is not appropriate; a Derived class object can remedy that by providing an appropriate implementation. Furthermore our author reasoned: since the type of an object determines the interface that is used, process must call Derived::_hello as _hello is called via process from a Derived class object. Unfortunately our author's reasoning is flawed, due to early binding. When Base::process was compiled static binding caused the compiler to bind the _hello call to Base::_hello. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 343

Polymorphism, early and late binding Late binding: assignment is done at run time. NB: C++ default is early binding! Late binding is necessary to implement the polymorphism. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 344

Polymorphism, early and late binding Late binding: assignment is done at run time. NB: C++ default is early binding! Late binding is necessary to implement the polymorphism. «virtual» specifier! Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 345

Example: early binding #ifndef MYCLASS_H #define MYCLASS_H #include <iostream> using namespace std; #include <myclass.h> void Base::process(){ _hello(); #include <myclass.h> int main(){ Base *base = new Base(); class Base{ ; void process(); void _hello(); class Derived : public Base{ void Base::_hello(){ cout << "base hello\n"; void Derived::_hello(){ cout << derived hello\n"; base->process(); Derived *derived = new Derived(); derived->process(); delete derived; delete base; return 0; base hello void _hello(); ; #endif // MYCLASS_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 346

Example: late binding, virtual specifier #ifndef MYCLASS_H #define MYCLASS_H #include <iostream> using namespace std; #include <myclass.h> void Base::process(){ _hello(); #include <myclass.h> int main(){ Base *base = new Base(); class Base{ ; void process(); virtual void _hello(); class Derived : public Base{ void Base::_hello(){ cout << "base hello\n"; void Derived::_hello(){ cout << derived hello\n"; base->process(); Derived *derived = new Derived(); derived->process(); delete derived; delete base; return 0; derived hello void _hello(); ; #endif // MYCLASS_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 347

Example: late binding, virtual specifier #ifndef MYCLASS_H #define MYCLASS_H #include <iostream> using namespace std; #include <myclass.h> void Base::process(){ _hello(); #include <myclass.h> int main(){ Base *base = new Base(); class Base{ void process(); virtual void _hello(); void Base::_hello(){ cout << "base hello\n"; void Derived::_hello(){ cout << derived hello\n"; base->process(); Derived *derived = new Derived(); derived->process(); Base *reftoderived = derived; ; class Derived : public Base{ void _hello(); reftoderived->process(); delete derived; delete base; return 0; derived hello ; #endif // MYCLASS_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 348

Example: late binding, virtual specifier #ifndef MYCLASS_H #define MYCLASS_H #include <iostream> using namespace std; #include <myclass.h> void Base::process(){ _hello(); #include <myclass.h> int main(){ Base *base = new Base(); class Base{ void process(); virtual void _hello(); void Base::_hello(){ cout << "base hello\n"; void Derived::_hello(){ cout << derived hello\n"; base->process(); Derived *derived = new Derived(); derived->process(); base hello Base *reftoderived = derived; ; class Derived : public Base{ void _hello(); reftoderived->process(); delete derived; delete base; return 0; derived hello ; #endif // MYCLASS_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 349

Example: late binding, virtual specifier #ifndef MYCLASS_H #define MYCLASS_H #include <iostream> using namespace std; #include <myclass.h> void Base::process(){ _hello(); #include <myclass.h> int main(){ Base *base = new Base(); class Base{ ; void process(); virtual void _hello(); class Derived : public Base{ void Base::_hello(){ cout << "base hello\n"; void Derived::_hello(){ cout << derived hello\n"; void AnotherDerived::_hello(){ cout << another derived hello\n"; base->process(); Derived *derived = new Derived(); derived->process(); AnotherDerived *anotherderived = new AnotherDerived(); Base *generic; base hello ; void _hello(); class AnotherDerived : public Base{ ; void _hello(); generic = base; generic->process(); generic = derived; generic->process(); generic = anotherderived; generic->process(); delete anotherderived; delete derived; delete base; derived hello another derived hello #endif // MYCLASS_H return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 350

Trapezium example: virtual void PrintName() #ifndef POLYGON_H #define POLYGON_H #include <iostream> class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); int _nsides; ; PolygonP.h file PolygonP.cpp file classtestp.cpp file class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); #include <PolygonP.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <PolygonP.h> int main(){ return 0; float _majoraxis; ; #endif // POLYGON_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 351

Trapezium example: virtual void PrintName() #ifndef POLYGON_H #define POLYGON_H #include <iostream> class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); virtual void PrintName(); int _nsides; ; PolygonP.h file PolygonP.cpp file classtestp.cpp file class Trapezium : public Polygon{ #include <PolygonP.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; void Polygon::PrintName(){ std::cout<< polygon!\n ; #include <PolygonP.h> int main(){ return 0; Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); float _majoraxis; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); ; #endif // POLYGON_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 352

Trapezium example: virtual void PrintName() #ifndef POLYGON_H #define POLYGON_H #include <iostream> class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); virtual void PrintName(); int _nsides; ; class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); float _majoraxis; PolygonP.h file PolygonP.cpp file classtestp.cpp file #include <PolygonP.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; void Polygon::PrintName(){ std::cout<< polygon!\n ; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <PolygonP.h> int main(){ Trapezium *t = new Trapezium(); t->printname(); Polygon *p = new Polygon(); p->printname(); Polygon *any; any = t; any->printname(); any = p; any->printname(); delete p; delete t; return 0; ; #endif // POLYGON_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 353

Trapezium example: virtual void PrintName() #ifndef POLYGON_H #define POLYGON_H #include <iostream> class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); virtual void PrintName(); int _nsides; ; class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); float _majoraxis; PolygonP.h file PolygonP.cpp file classtestp.cpp file #include <PolygonP.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; void Polygon::PrintName(){ std::cout<< polygon!\n ; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); #include <PolygonP.h> int main(){ Trapezium *t = new Trapezium(); t->printname(); Polygon *p = new Polygon(); p->printname(); Polygon *any; any = t; any->printname(); any = p; any->printname(); delete p; delete t; return 0; polygon! polygon! polygon! polygon! ; #endif // POLYGON_H Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 354

Trapezium example: virtual void PrintName() #ifndef POLYGON_H #define POLYGON_H #include <iostream> class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); virtual void PrintName(); int _nsides; ; class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); void PrintName(); float _majoraxis; ; #endif // POLYGON_H PolygonP.h file PolygonP.cpp file classtestp.cpp file #include <PolygonP.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; void Polygon::PrintName(){ std::cout<< polygon!\n ; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); void Trapezium::PrintName(){ std::cout<< trapezium!\n ; #include <PolygonP.h> int main(){ Trapezium *t = new Trapezium(); t->printname(); Polygon *p = new Polygon(); p->printname(); Polygon *any; any = t; any->printname(); any = p; any->printname(); delete p; delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 355

Trapezium example: virtual void PrintName() #ifndef POLYGON_H #define POLYGON_H #include <iostream> class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); virtual void PrintName(); int _nsides; ; class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); void PrintName(); float _majoraxis; ; #endif // POLYGON_H PolygonP.h file PolygonP.cpp file classtestp.cpp file #include <PolygonP.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; void Polygon::PrintName(){ std::cout<< polygon!\n ; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); void Trapezium::PrintName(){ std::cout<< trapezium!\n ; #include <PolygonP.h> int main(){ Trapezium *t = new Trapezium(); t->printname(); Polygon *p = new Polygon(); p->printname(); Polygon *any; any = t; any->printname(); any = p; any->printname(); delete p; delete t; return 0; trapezium! polygon! trapezium! polygon! Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 356

Trapezium example: virtual void PrintName() #ifndef POLYGON_H #define POLYGON_H #include <iostream> class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); virtual void PrintName(); int _nsides; ; class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); void PrintName(); float _majoraxis; ; #endif // POLYGON_H PolygonP.h file PolygonP.cpp file classtestp.cpp file #include <PolygonP.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; void Polygon::PrintName(){ std::cout<< polygon!\n ; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); void Trapezium::PrintName(){ std::cout<< trapezium!\n ; #include <PolygonP.h> int main(){ Trapezium *t = new Trapezium(); t->printname(); Polygon *p = new Polygon(); p->printname(); Polygon *any; any = t; any->printname(); any = p; any->printname(); t->polygon::printname(); delete p; delete t; return 0; trapezium! polygon! trapezium! polygon! polygon! Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 357

Polymorphism, abstract base classes The base class Polygon is provided with its own concrete implementations of its virtual member PrintName(). However, virtual member functions do not necessarily have to be implemented in base classes. When the implementations of virtual members are omitted from base classes the class imposes requirements upon derived classes. The derived classes are required to (MUST!) provide the `missing implementations' This approach, in some languages (like C#, Delphi and Java) known as an interface, defines a protocol. Derived classes must obey the protocol by implementing the as yet not implemented members. If a class contains at least one member whose implementation is missing no objects of that class can be declared in the program. Such incompletely defined classes are always base classes. They enforce a protocol by merely declaring names, return values and arguments of some of their members. These classes are call abstract classes or abstract base classes. Derived classes become non-abtract classes by implementing the as yet not implemented members. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 358

Pure virtual methods pure virtual methods declaration: if method void Print() is not implemented in class Base then it must be declared this way: virtual void Print() = 0; classes containing pure virtual methods cannot be instantiated in the program: Base *b = new Base(); Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 359

Trapezium example: virtual void PrintName() #ifndef POLYGON_H #define POLYGON_H #include <iostream> class Polygon{ Polygon(); void SetNsides(int nos); int GetNsides(); virtual void PrintName() = 0; int _nsides; ; class Trapezium : public Polygon{ Trapezium(); float GetMajorAxis(); void SetMajorAxis(float cm); void PrintName(); float _majoraxis; ; #endif // POLYGON_H PolygonP.h file PolygonP.cpp file classtestp.cpp file #include <PolygonP.h> Polygon::Polygon(){ _nsides = 0; int Polygon::GetNsides(){ return _nsides; void Polygon::SetNsides(int nos){ _nsides = nos; void Polygon::PrintName(){ std::cout<< polygon!\n ; Trapezium::Trapezium(){ _majoraxis = 0.; _minoraxis = 0.; _height = 0.; SetNsides(4); void Trapezium::PrintName(){ std::cout<< trapezium!\n ; #include <PolygonP.h> int main(){ Trapezium *t = new Trapezium(); t->printname(); Polygon *p = new Polygon(); p->printname(); Polygon *any; any = t; any->printname(); any = p; any->printname(); delete p; delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 360

2017/03/17 take home messages use fstream for I/O from files namespaces: like directories and filenames structures: aggregate of different data types objects have properties (weight, colour, ) and can perform or used to perform actions (pulling, hitting, ) a class represent an object class members are the properties class methods are the actions header: properties and definition of actions implementaton: how actions are taken how to compile (slides 278-283) Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 361

2017/03/17 take home messages overloading: two functions/methods can be implemented differentely if different input variables are used (public) inheritance: a daughter class brings in her public zone all public members and methods of the mother class polymorphism: http://www.html.it/pag/15595/ilpolimorfismo/ different objects have the possibility to act in a different way to the same command. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 362

Exercises Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 363

Exercise, now and next Friday 1. Download from moodle the three files trapezium.h, trapezium.cpp, classtest.cpp 2. Try to compile and run the program (slides 278-283 of this presentation). Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 364

Exercise, now and next Friday 3. Add a public method to the class called calculatearea returning a float with the calculated trapezium area using the major/minor bases and height stored as class members: modify trapezium.h and trapezium.cpp in order to make working the user program on the right of this slide. #include <iostream> #include <trapezium.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << t->setmajoraxis(10.); t->setminoraxis(4.); t->setheight(2.); float area = t->calculatearea(); cout << A = << t->getmajoraxis() << cout << a = << t->getminoraxis() << cout << h = << t->getheight() << cout << Area is << area << delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 365

Exercises 1. Download from moodle the following files: Polygon.cpp classtesti.cpp Polygon.h TrapeziumO.h classtesto.cpp TrapeziumO.cpp PolygonP.cpp PolygonP.h classtestp.cpp 2. Compile and run the executables: classtesto (overloading) classtesti (inheritance) classtestp (polymorphism) Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 366

Exercises 3. Add: overloading: a SetMajorAxis(float cm, bool checkrange) inheritance: a private variable _area inside polygon class with proper getter and setter polymorphism: virtualize calculatearea in polygon class, implement it in the derived class trapezium Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 367

Exercise 1 OVERLOADING: to TrapeziumO.h /.cpp add a method called: SetMajorAxis(float cm, bool checkrange) which check that the major axis is between 1 and 10, if not it prints a warning. #include <iostream> #include <TrapeziumO.h> using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << "A = " << t->getmajoraxis() << "\n"; cout << "a = " << t->getminoraxis() << "\n"; cout << "h = " << t->getheight() << "\n"; t->setmajoraxis(10.); cout << "A = " << t->getmajoraxis() << "\n"; t->setmajoraxis(5., true); cout << "A = " << t->getmajoraxis() << "\n"; t->setmajoraxis(15., true); cout << "A = " << t->getmajoraxis() << "\n"; delete t; return 0; warning, out of range! Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 368

Exercise 2 #include <iostream> #include <Polygon.h> INHERITANCE: to Polygon.h /.cpp add a private variable _area to polygon class with proper getter and setter using namespace std; int main(){ Trapezium *t = new Trapezium(); cout << "A = " << t->getmajoraxis() << "\n"; t->setmajoraxis(10.); cout << "A = " << t->getmajoraxis() << "\n"; cout << "number of sides = " << t->getnsides() << "\n"; t->setarea(192.); cout << area of trapezium is " << t->getarea() << "\n"; Polygon *p = new Polygon(); p->setarea(792.); cout << area of polygon is " << p->getarea() << "\n"; delete p; delete t; return 0; Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 369

Exercise 3 POLYMORPHISM: into PolygonP.h /.cpp virtualize calculatearea in polygon class, implement it in the derived class trapezium #include <PolygonP.h> int main(){ Trapezium *t = new Trapezium(2.,2.,1.); t->printname(); Polygon *p = new Polygon(); p->printname(); p->calculatearea(); t->calculatearea(); delete p; delete t; return 0; cannot calculate area of unknown polygon calculating trapezium area, it is: 2. Emiliano Mocchiutti, INFN Trieste Programmazione C++ per la Fisica Università degli Studi di Trieste, 2016/2017 370