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