Financial computing with C++

Similar documents
Financial computing with C++

Financial computing with C++

Financial computing with C++

CS250 Final Review Questions

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

CS32 - Week 4. Umut Oztok. Jul 15, Umut Oztok CS32 - Week 4

Inheritance and Polymorphism

Inheritance, and Polymorphism.

Lecture 5: Inheritance

VIRTUAL FUNCTIONS Chapter 10

Object Oriented Programming: Inheritance Polymorphism

AIMS Embedded Systems Programming MT 2017

G52CPP C++ Programming Lecture 13

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

18. Dynamic Data Structures I. Dynamic Memory, Addresses and Pointers, Const-Pointer Arrays, Array-based Vectors

EL2310 Scientific Programming

CE221 Programming in C++ Part 1 Introduction

UEE1303(1070) S12: Object-Oriented Programming Advanced Topics of Class

Array Elements as Function Parameters

Object Oriented Software Design II

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

Fast Introduction to Object Oriented Programming and C++

Object Oriented Software Design II

PIC10B/1 Winter 2014 Exam I Study Guide

Derived Classes in C++

IS 0020 Program Design and Software Tools

OBJECT ORIENTED PROGRAMMING USING C++

Object Oriented Design Final Exam (From 3:30 pm to 4:45 pm) Name:

Object-Oriented Concept

Programming in C and C++

Slide Set 14. for ENCM 339 Fall Steve Norman, PhD, PEng. Electrical & Computer Engineering Schulich School of Engineering University of Calgary

Intro to OOP Visibility/protection levels and constructors Friend, convert constructor, destructor Operator overloading a<=b a.

C++ (Non for C Programmer) (BT307) 40 Hours

EL2310 Scientific Programming

SRM ARTS AND SCIENCE COLLEGE SRM NAGAR, KATTANKULATHUR

Shahram Rahatlou. Computing Methods in Physics. Overloading Operators friend functions static data and methods

Polymorphism. Zimmer CSCI 330

CSE 374 Programming Concepts & Tools. Hal Perkins Spring 2010

Object-Oriented Principles and Practice / C++

Financial computing with C++

Financial computing with C++

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

Introduction Of Classes ( OOPS )

C++ TEMPLATES. Templates are the foundation of generic programming, which involves writing code in a way that is independent of any particular type.

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

Why use inheritance? The most important slide of the lecture. Programming in C++ Reasons for Inheritance (revision) Inheritance in C++

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

CPSC 427: Object-Oriented Programming

Part VIII. More classes. Philip Blakely (LSC) C++ Introduction 226 / 370

CS105 C++ Lecture 7. More on Classes, Inheritance

Absolute C++ Walter Savitch

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

AN OVERVIEW OF C++ 1

Part X. Advanced C ++

CS304 Object Oriented Programming Final Term

Intermediate Programming, Spring 2017*

Passing arguments to functions by. const member functions const arguments to a function. Function overloading and overriding Templates

G52CPP C++ Programming Lecture 14. Dr Jason Atkin

Polymorphism Part 1 1

Intermediate Programming, Spring 2017*

Midterm Review. PIC 10B Spring 2018

UEE1303(1070) S12: Object-Oriented Programming Operator Overloading and Function Overloading

CSI33 Data Structures

Object Oriented Programming

Instantiation of Template class

Short Notes of CS201

Object Oriented Software Design II

Midterm Exam 5 April 20, 2015

Chapter 11. The first objective here is to make use of the list class definition from a previous lab. Recall the class definition for ShapeList.

Software Engineering Concepts: Invariants Silently Written & Called Functions Simple Class Example

Advanced Systems Programming

22316 Course Title : Object Oriented Programming using C++ Max. Marks : 70 Time: 3 Hrs.

COMP6771 Advanced C++ Programming

C++ Inheritance and Encapsulation

CS201 - Introduction to Programming Glossary By

Lecture-5. Miscellaneous topics Templates. W3101: Programming Languages C++ Ramana Isukapalli

C++ Crash Kurs. Polymorphism. Dr. Dennis Pfisterer Institut für Telematik, Universität zu Lübeck

Object-Oriented Programming, Iouliia Skliarova

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

What is an algorithm?

CS

Computer Programming Inheritance 10 th Lecture

2. COURSE DESIGNATION: 3. COURSE DESCRIPTIONS:

Week 8: Operator overloading

B.C.A 2017 OBJECT ORIENTED PROGRAMMING USING C++ BCA303T MODULE SPECIFICATION SHEET

Scope and Parameter Passing

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

04-24/26 Discussion Notes

6.096 Introduction to C++ January (IAP) 2009

Object Oriented Programming. Solved MCQs - Part 2

CS Lecture #6. Administrative... Assignment #2 Graded NN Turned In, Average Grade: XX Assignment #3 due on Thursday

Operator overloading

Abstraction and Encapsulation. Benefits of Abstraction & Encapsulation. Concrete Types. Using Typedefs to streamline classes.

CSE 303: Concepts and Tools for Software Development

Programming, numerics and optimization

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

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

SFU CMPT Topic: Has-a Relationship

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

C++ Constructs by Examples

Transcription:

Financial Computing with C++, Lecture 11 - p1/24 Financial computing with C++ LG Gyurkó University of Oxford Michaelmas Term 2015

Financial Computing with C++, Lecture 11 - p2/24 Outline Derived classes - an example Class hierarchy Derived classes - example implementations

Financial Computing with C++, Lecture 11 - p3/24 Outline of the course Programming is learned by writing programs. Brian Kernighan

Financial Computing with C++, Lecture 11 - p4/24 Outline of this lecture - derived classes and inheritance, dynamic polymorphism Brian: The crowd: Brian: The crowd: Man in crowd: The crowd: You re all individuals! Yes, we are all individuals! You re all different! Yes, we re all different! I m not... Shhhhhh! Life of Brian

Financial Computing with C++, Lecture 11 - p5/24 Derived classes - example A base class 1 class UniversityMember { 2 public: 3 UniversityMember(std::string sfirstname, std::string ssurname); 4 virtual UniversityMember(); 5 std::string getname() const; 6 virtual std::ostream & printdetails(std::ostream & os) const; 7 8 private: 9 std::string sfirstname_; 10 std::string ssurname_; 11 }; This looks like a simple class with a constructor, destructor, two other public member functions and two private data members...... except for the two occurrences of the keyword virtual. Using the keyword virtual indicates that one intends to derive other classes from this (that s what makes this a base class). For proper behaviour the destructor of base classes must be declared virtual; this guarantees that both the base and derived classes are destroyed properly when needed (see the structure later, also see slides 22-23). The function printdetails() is also declared virtual, which makes it possible to override (assign different behaviour) in derived classes.

Financial Computing with C++, Lecture 11 - p6/24 Derived classes - example A class publicly derived from UniversityMember 1 class Student : public UniversityMember { 2 public: 3 Student(std::string sfirstname, std::string ssurname, 4 std::string scollege, std::string scourse); 5 std::ostream & printdetails(std::ostream & os) const; 6 7 private: 8 std::string scollege_; 9 std::string scourse_; 10 11 }; publicly derived means that Student is a UniversityMember with some additional members: the base class members are inherited by the derived class. Only the additional members are declared in the body of Student. The non-virtual function getname() can be called from both the base and derived classes, and it ll execute the implementation given in the base class Both the base and the derived classes provide the virtual member printdetails(), however when it s called from the derived class it ll do something Student-specific.

Financial Computing with C++, Lecture 11 - p7/24 Derived classes - example Another class publicly derived from UniversityMember 1 class Faculty : public UniversityMember { 2 public: 3 Faculty(std::string sfirstname, std::string ssurname, 4 std::string sdepartment, unsigned int igrade); 5 std::ostream & printdetails(std::ostream & os) const; 6 void addstudent(student &); 7 8 private: 9 std::list<student> getstudents() const; 10 std::string sdepartment_; 11 unsigned int igrade_; 12 std::list<student> lsupervisedstudents_; 13 }; Faculty is a UniversityMember but not a Student, i.e. the common properties of the different UniversityMember s is included in the declaration of the base class The derive classes contain the derive class specific members (i.e. sdepartment_ and igrade_, lsupervisestudents, addstudent(), getstudents()) The Faculty-specific members are only accessible from Faculty (friend s of faculty, and maybe the classes derived from Faculty)

Derived classes - structure UniversityMember s scope getname() virtual printdetails() sfirstname ssurname Faculty s scope printdetails() addstudent() getstudents() sdepartment igrade lsupervisedstudents When an instance of the derived class is created, an instance of the base class is also created in the background (see the implementation of derived constructor) References to base and pointers to base can refer to/point to instances of derived. In such a case the derived specific virtual functions are used. (see the main code of the example). Non-virtual members of the base can be redefined in the derived class, however this yields an unexpected behaviour (see Effective C++ by Scott Meyers for details). Financial Computing with C++, Lecture 11 - p8/24

Financial Computing with C++, Lecture 11 - p9/24 Derived classes - class hierarchy class UniversityMember class Student class Faculty In graphical illustrations, the arrow indicates the base-derived relationship (the arrow pointing from the derived to the base). More complicated hierarchies are allowed in C++, e.g. one can derive from derived classes, classes can be derived from multiple base classes, etc., e.g.: class A class B class AB class AC class ACD class ACBE

Financial Computing with C++, Lecture 11 - p10/24 Derived classes - example Implementation of the members of UniversityMember 1 UniversityMember::UniversityMember(std::string sfirstname, 2 std::string ssurname) 3 : sfirstname_(sfirstname), ssurname_(ssurname){} 4 5 UniversityMember:: UniversityMember(){} 6 7 std::string UniversityMember::getName() const { 8 return "Name: " + sfirstname_ + " " + ssurname_; 9 } 10 11 std::ostream & 12 UniversityMember::printDetails(std::ostream & os) const { 13 os << getname(); 14 return os; 15 } getname() returns a string constructed from the names. printdetails() copies the getname() generated name into an output stream. If a derived class does not implement printdetails() the implementation of the base is used.

Financial Computing with C++, Lecture 11 - p11/24 Derived classes - example Implementation of the members of Student 1 Student::Student(std::string sfirstname, 2 std::string ssurname, 3 std::string scollege, 4 std::string scourse) 5 : UniversityMember(sFirstName, ssurname), 6 scollege_(scollege), 7 scourse_(scourse) {} 8 9 std::ostream & Student::printDetails(std::ostream & os) const { 10 os<< getname() << ", College: " << scollege_ 11 << ", Course: " << scourse_; 12 return os; 13 } The constructor of the derived class initializes the base s data members, however the base s private members are not accessible directly. (If it s not done explicitly, the compiler will call the default constructor of the base.) Note how the derived class constructor initializes the base part, using its constructor. The derived s members are initialized the usual way. The member printdetails() is overridden, i.e. a derived specialized version is implemented.

Financial Computing with C++, Lecture 11 - p12/24 Derived classes - example Implementation of the members of faculty 1 Faculty::Faculty(std::string sfirstname, 2 std::string ssurname, 3 std::string sdepartment, 4 unsigned int igrade) 5 : UniversityMember(sFirstName, ssurname), 6 sdepartment_(sdepartment), 7 igrade_(igrade) {} 8 9 10 std::ostream & Faculty::printDetails(std::ostream & os) const { 11 os<< getname() << ", Department: " << sdepartment_ 12 << ", Grade: " << igrade_; 13 return os; 14 } Faculty s constructor initialises the base part using its constructor. printdetails() is overridden.

Financial Computing with C++, Lecture 11 - p13/24 Derived classes - is-a relationship demonstrated 1 std::ostream & operator<<(std::ostream & os, 2 const UniversityMember & um) { 3 return um.printdetails(os); 4 } 1 void testmembers() { 2 UniversityMember um("john","doe"); 3 Student st("howard","wolowitz", "St Hugh s", 4 "MSc Engineering"); 5 Faculty fa("sheldon","cooper","physics",8); 6 7 cout << "um: " << um << endl; 8 cout << "um.getname(): " << um.getname() << endl << endl; 9 cout << "st: " << st << endl; 10 cout << "st.getname(): " << st.getname() << endl << endl; 11 cout << "fa: " << fa << endl; 12 cout << "fa.getname(): " << fa.getname() << endl << endl; 13 } The function operator<<() s second argument is a reference to a UniversityMember. In the implementation of operator<<() the virtual member of UniversityMember is called. In the main operator<<() is called with base and derived arguments. See output on next slide.

Financial Computing with C++, Lecture 11 - p14/24 Derived classes - is-a relationship demonstrated um: Name: John Doe um.getname(): Name: John Doe st: Name: Howard Wolowitz, College: St Hugh s, Course: MSc Engineering st.getname(): Name: Howard Wolowitz fa: Name: Sheldon Cooper, Department: Physics, Grade: 8 fa.getname(): Name: Sheldon Cooper Functions taking the base class by reference can take reference to derived instances. In such case, if the virtual member is called, the one belonging to the derived class is looked up and executed. This lookup results in a bit of performance overhead (see exercise). When the non-virtual base member getname() is called on any of the base or derived instances, the one implemented in the base (the only one anywhere implemented) is executed.

Financial Computing with C++, Lecture 11 - p15/24 Derived classes - slicing demonstrated 1 vector<universitymember> vec1; 2 vec1.push_back(um); 3 vec1.push_back(st); 4 vec1.push_back(fa); 5 cout << "Slicing:.printeDetails() called on values\n"; 6 for(unsigned int i=0; i<vec1.size(); ++i) 7 (vec1[i].printdetails(cout) )<< endl; Slicing:.printeDetails() called on values Name: John Doe Name: Howard Wolowitz Name: Sheldon Cooper The push_back() member of vector copies elements by value, and in this case, the derived part of the elements is sliced. When calling the virtual member, the one in the base is executed (note: for each instance only the name is displayed, the other details are lost). Recall that function objects are passed by value to algorithms. Function objects are required to be monomorphic due to avoid slicing.

Financial Computing with C++, Lecture 11 - p16/24 Derived classes - polymorphism demonstrated 1 typedef sptr::shared_ptr<universitymember> UMPtr; 2 vector<umptr> vec2; 3 vec2.push_back(umptr(new UniversityMember(um))); 4 vec2.push_back(umptr(new Student(st))); 5 vec2.push_back(umptr(new Faculty(fa))); 6 cout << "\npolymorphism: ->printedetails() called on pointers\n"; 7 for(unsigned int i=0; i<vec2.size(); ++i) 8 (vec2[i]->printdetails(cout) ) << endl; Polymorphism: ->printedetails() called on pointers Name: John Doe Name: Howard Wolowitz, College: St Hugh s, Course: MSc Engineering Name: Sheldon Cooper, Department: Physics, Grade: 8 In this example, we store pointers to the base class in a vector. Copying the pointer by value does not change the object it points to. A pointer of type pointer to base can actually be the address of an instance of the derived class. Calling the virtual member through pointers to base (using the operator ->) executes the version of the derived class, i.e. it s polymorphic.

Financial Computing with C++, Lecture 11 - p17/24 Derived classes as function arguments 1 void testfunction1(universitymember um) { 2 //argument taken by value, derived part sliced 3 um.printdetails(cout); 4 cout << endl; 5 } 6 void testfunction2(universitymember & um) { 7 //argument taken by reference, derived part kept 8 um.printdetails(cout); 9 cout << endl; 10 } 1 cout << "\npolymorphism via reference\n"; 2 cout << "testfunction1(um): " ; 3 testfunction1(um); 4 cout << "testfunction1(st): " ; 5 testfunction1(st); 6 cout << "testfunction1(fa): " ; 7 testfunction1(fa); 8 cout << "testfunction2(um): " ; 9 testfunction2(um); 10 cout << "testfunction2(st): " ; 11 testfunction2(st); 12 cout << "testfunction2(fa): " ; 13 testfunction2(fa);

Financial Computing with C++, Lecture 11 - p18/24 Derived classes as function arguments Polymorphism via reference testfunction1(um): Name: John Doe testfunction1(st): Name: Howard Wolowitz testfunction1(fa): Name: Sheldon Cooper testfunction2(um): Name: John Doe testfunction2(st): Name: Howard Wolowitz, College: St Hugh s, Course: MSc Engineering testfunction2(fa): Name: Sheldon Cooper, Department: Physics, Grade: 8 Functions taking base type as argument can actually take instances of derived. Derived is a base, therefore functions taking base by value, will use the base part of the instances of derived (derived part is sliced). If the function takes base by reference, it will keep the derived part of the derived objects and will access the polymorphic behaviour.

Financial Computing with C++, Lecture 11 - p19/24 Derived classes - another example 1 class Base { 2 public: 3 virtual Base(){} 4 virtual void memberfn(base & base) { 5 std::cout << "virtual member of Base" << std::endl; 6 } 7 }; 8 9 class Derived : public Base 10 { 11 public: 12 //overridden virtual function 13 void memberfn(base & base) { 14 std::cout << "overridden virtual of Derived" << std::endl; 15 } 16 //non-virtual member, overloads memberfn(), 17 //feature in Derived only 18 void memberfn(derived & derived) { 19 std::cout << "additional feature of Derived" << std::endl; 20 } 21 };

Financial Computing with C++, Lecture 11 - p20/24 Derived classes - another example 1 Base b; 2 Derived d; 3 Base & rb1 = b; 4 Base & rb2 = d; 5 Derived & rd = d; 6 rb1.memberfn(rb1); 7 rb1.memberfn(rb2); 8 rb1.memberfn(rd); 9 rb2.memberfn(rb1); 10 rb2.memberfn(rb2); 11 rb2.memberfn(rd); 12 rd.memberfn(rb1); 13 rd.memberfn(rb2); 14 rd.memberfn(rd);

Financial Computing with C++, Lecture 11 - p21/24 Derived classes as function arguments virtual member of Base virtual member of Base virtual member of Base overridden virtual of Derived overridden virtual of Derived overridden virtual of Derived overridden virtual of Derived overridden virtual of Derived additional feature of Derived rb1.memberfn(...) always calls the member of Base rb2 is referred to by a reference to Base, therefore only the features declared in Base are accessible, that is the additional overloaded method is not visible. rb2 is recognised to be an instance of Derived, the overridden version of the polymorphic feature is called. The additional overloaded feature of Derived is only called when the variable is explicitly of type Derived.

Financial Computing with C++, Lecture 11 - p22/24 Why do virtual destructors matter? 1 class BaseWithDefect { 2 public: 3 BaseWithDefect(std::string name) : m_name(name) {} 4 BaseWithDefect(){ 5 std::cout << "BaseWithDefect with name " << m_name 6 << " is being destroyed." << std::endl; 7 } 8 9 private: 10 std::string m_name; 11 }; 12 13 class DerivedFromBWD : public BaseWithDefect { 14 public: 15 DerivedFromBWD(std::string name1, std::string name2) : 16 BaseWithDefect(name1), m_name2(name2) {} 17 DerivedFromBWD(){ 18 std::cout << "DerivedFromBWD with name " << m_name2 19 << " is being destroyed." << std::endl; 20 } 21 22 private: 23 std::string m_name2; 24 };

Financial Computing with C++, Lecture 11 - p23/24 Why do virtual destructors matter? 1 BaseWithDefect * bptr1 = new BaseWithDefect("Zero BWD."); 2 BaseWithDefect * bptr2 = new DerivedFromBWD("First BWD.","First D."); 3 DerivedFromBWD * dptr = new DerivedFromBWD("Second BWD.","Second D."); 4 delete bptr1; 5 delete bptr2; 6 delete dptr; BaseWithDefect with name Zero BWD. is being destroyed. BaseWithDefect with name First BWD. is being destroyed. DerivedFromBWD with name Second D. is being destroyed. BaseWithDefect with name Second BWD. is being destroyed. Note: The destructor of the base class is not virtual, therefore the derived part of bptr2 is not destroyed.

Financial Computing with C++, Lecture 11 - p24/24 Derived classes - Summary polymorphism can be implemented via derived classes (public inheritance) the base class defines the common framework (virtual and non-virtual functions) the derived class specific behaviour is implemented via overriding virtual functions if the virtual function is not implemented in the derived class, the implementation in base will be used (exception: pure virtual function, see next lecture) the base class defines the common behaviour (non-virtual member functions and data members), these are also properties of the derived classes derived classes can have properties not defined in the base s framework classes can be derived from multiple base classes polymorphism can be exploited via references or pointers