Programmierkurs. Steffen Müthing. January 18, Interdisciplinary Center for Scientific Computing, Heidelberg University

Ähnliche Dokumente
Programmierkurs. Steffen Müthing. December 7, Interdisciplinary Center for Scientific Computing, Heidelberg University

Vererbung und Polymorphie

11.3 Virtuelle Methoden

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

Probeklausur. Musterlösung

Exceptions und Vererbung

Vorlesung Datenstrukturen

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Die verschiedenen Programmierparadigmen von C++ Software-Technik: Vom Programmierer zur erfolgreichen

Praxisorientierte Einführung in C++ Lektion: "Virtuelle Methoden"

11.3 Virtuelle Methoden

Vorkurs Informatik: Erste Schritte der Programmierung mit C++

Programmierung und Angewandte Mathematik

Programmierkurs. Steffen Müthing. November 30, Interdisciplinary Center for Scientific Computing, Heidelberg University

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Prinzipien der objektorientierten Programmierung (OOP)

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Algorithmen und Datenstrukturen

Einführung in C# Teil 3. Matthias Nübling

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

Objektorientierte Programmierung mit C++ SS 2007

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 2. Teil

Einführung in das Objektorientierte Programmieren mit C++

Einstieg in die Informatik mit Java

Mikrorechentechnik II. Klassen in C++

Programmierkurs C++ Templates & STL (1/2)

Polymorphismus 44. Function.hpp. #include <string>

Informatik II Übung 6

Objektorientierte Programmierung II

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Polymorphismus 179. Function.h. #include <string>

Programmierpraktikum 3D Computer Grafik

Vererbung, Polymorphie

C++ - Objektorientierte Programmierung Polymorphie

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

Aufgabenblatt 11 Musterlösung

Objektorientierte Anwendungsentwicklung

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Überblick. 6. Konstruktor und Destruktor - obligatorische Elementfunktionen einer Klasse

Visuelle Kryptographie. Anwendung von Zufallszahlen

Informatik - Übungsstunde

C tor = Contructor D tor = Destructor

Übersicht. Bisherige Verwendung von Klassen Vererbung. Zeiger auf Objekte (abgeleiteter) Klassen Virtuelle Funktionen Konstruktoren/Destruktoren

Überblick. Überblick. Abstrakte Klassen - rein virtuelle Funktionen Beispiele

Objektorientierte Programmierung mit C++

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Programmierkurs C/C++

Vorlesung Programmieren

Programmierkurs. Steffen Müthing. November 16, Interdisciplinary Center for Scientific Computing, Heidelberg University

Grundzüge der Programmierung. Wiederverwendung POLYMORPHIE

C++ - Objektorientierte Programmierung Vererbung

Einstieg in die Informatik mit Java

Polymorphie. 15. Java Objektorientierung II

Polymorphie Begriffsklärung und Anwendung

Kapitel 8 Vererbung. Korbinian Molitorisz. IPD Tichy Lehrstuhl für Programmiersysteme

Vererbung und Polymorphie

Grundlagen der Informatik

Polymorphie. 15. Java Objektorientierung II

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Häufig verwendete Muster (unter Ausnutzung von Zugriffsrechten)

Universität Karlsruhe (TH)

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

Die abstrakte Klasse Expression:

OOP. Kapselung: Gruppierung von Daten und Funktionen als Objekte. Definieren eine Schnittstelle zu diesen Objekten.

Angewandte Mathematik in OOP WS 2011/12. Abschluss-Test

Vererbung I. Kfz Eigenschaften und Methoden der Klasse Kfz Lkw. Pkw. Eigenschaften und Methoden der Klasse Kfz

Programmieren in Java

HSR Rapperswil 2001 Markus Rigling. Programmieren: Smart Pointer Auflage

1.4. Funktionen. Objektorientierte Programmierung mit C++

Abend 4 Übung : Erweitern von Klassen durch Vererbung

Zeiger und Referenzen können polymorph sein (Objekte NICHT)!

Lambda-Funktionen. Lambda-Funktionen. Lambda-Funktionen sollen

22. Subtyping, Polymorphie und Vererbung

OOP und Angewandte Mathematik (Praktikum 1) Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Crashkurs C++ - Teil 1

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen

Grundkurs C++ IDE Klassenhierarchien

19. Vererbung und Polymorphie

4. Objektorientierte Programmierung mit C++

Gliederung. Algorithmen und Datenstrukturen II. Java: Objektorientierung. Java: Objektorientierung. Objektorientierung in JAVA. D.

Algorithmen und Datenstrukturen II

Grundkurs C++ IDE Klassenhierarchien

Praxis der Programmierung

Objektorientierte Programmierung III

Teil 8: Dynamische Speicherverwaltung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

Programmieren 1 09 Vererbung und Polymorphie

Programmieren II Abstrakte Klassen / Virtuelle Methoden. Programmieren II Abstrakte Klassen / Virtuelle Methoden

Programmierkurs. SoSe Markus Geveler Inst. f. Applied Mathematics, TU Dortmund.

Probeklausur: Programmierung WS04/05

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13

Grundlagen der OO- Programmierung in C#

Kapitel 4.2. Dynamische Datenstrukturen. Nächste Woche: 4. und letzte Schnellübung. Übungsaufgaben: 71-74, 2-aus-4, Rest Bonus.

Programmierkurs C++ Abstrakte Klassen und Methoden

Grundlagen Polymorphismus Eigenschaften virtueller Klassen Mehrfachvererbung bei ROOT. Mehrfache Vererbung. Daniel Beneckenstein. 21.

Einführung in die Programmierung mit C++

4. Objektorientierte Programmierung mit C++

Transkript:

Programmierkurs Steffen Müthing Interdisciplinary Center for Scientific Computing, Heidelberg University January 18, 2019

Konzepte Standard-Konzepte für Code Reuse: Polymorphie/Vererbung Funktionalität wird für Basisklasse geschrieben. Akzeptiert auch Objekte von abgeleitetem Typ. Beschränkt auf objektorientierte Programmierung. Optional: Laufzeit-Polymorphie Templates Der Typ selbst wird ein Parameter. Akzeptiert jeden Typ, für den der geschriebene Code kompiliert werden kann. Compilezeit-Polymorphie

Vererbung Klassen können von anderen Klassen erben. Wichtigste Regel: is-a Is a circle a shape? Abgeleitete Klasse enthält alle Variablen und Methoden der Basisklasse. Methoden können überschrieben werden. Variablen vom Typ der Basisklasse können Objekte von abgeleiteten Klassen zugewiesen werden. Erweitern der Basisklasse um zusätzliche Funktionalität. Circle volume() _radius Shape dimension() volume() name() _name TwoDShape dimension() Rectangle volume() _width _height

Verwendung von Klassenhierarchien Referenzen und Pointer auf Basisklassen funktionieren auch mit abgeleiteten Klassen: Circle c(...); Shape& s_ref = c; Beim Kopieren von Objekten werden nur die enthaltenen Daten der Basisklasse kopiert, Informationen aus abgeleiteten Klassen gehen verloren: // only copies member variable _name Shape s_copy = c; Eine Referenz auf die Basisklasse hat nur Zugang zu den Methoden und Variablen der Basis: s_ref._name; // ok s_ref._radius // compile error Aufgerufene Funktionen immer aus der Basisklasse: c.volume() // calls Circle::volume() s_ref.volume() // calls Shape::volume()

Speichern von polymorphen Objekten Bei Verwendung ist der exakte Typ (und Speicherbedarf) nicht bekannt: sizeof(circle)!= sizeof(rectangle) Container brauchen Objekte fixer Grösse Wie legen wir eine Liste mit unterschiedlichen Objekten an?

Speichern von polymorphen Objekten Bei Verwendung ist der exakte Typ (und Speicherbedarf) nicht bekannt: sizeof(circle)!= sizeof(rectangle) Container brauchen Objekte fixer Grösse Wie legen wir eine Liste mit unterschiedlichen Objekten an? Lösung: Dynamische Speicherverwaltung Wir speichern eine Liste von Pointern auf Objekte und lassen uns dynamischen Speicher für das eigentliche Objekt geben Man spricht davon, dass das Objekt auf dem Heap angelegt wird, normale Variablen liegen auf dem Stack Objekte auf dem Heap werden NICHT automatisch aufgeräumt, wenn das aktuelle Scope endet Bei manueller Verwaltung: Speicher geht eventuell verloren Daher: Immer smart pointer verwenden

Smart Pointers Ein Smart Pointer reserviert Speicher für ein Objekt auf dem Heap und räumt das Objekt auf, wenn es nicht mehr verwendet wird. unique_ptr erzeugt das neue Objekt beim Anlegen und gibt es frei, sobald die Pointer-Variable aufhört zu existieren: #include <memory> std::unique_ptr<int> foo(int i) { return std::make_unique<int>(i); } int add(int a, int b) { auto p = foo(a); return *p + b; } // memory gets freed here unique_ptr kann nur verschoben werden, nicht kopiert

Smart Pointers für geteilte Objekte Oft ist es nicht möglich, einen eindeutigen Eigentümer für ein Objekt festzulegen. Hierfür gibt es shared_ptr. Mehrere shared_ptr können auf das gleiche Objekt zeigen. Das Objekt wird genau dann freigegeben, wenn der letzte shared_ptr auf das Objekt zerstört wird. Wichtig: shared_ptr immer nur mit make_shared anlegen oder aus anderen shared_ptrn kopieren! #include <memory> std::shared_ptr<int> foo(int i) { return std::make_shared<int>(i); } int add(int a, int b) { auto p = foo(a); auto p2 = p; return p + p2 + b; } // memory gets freed here

Dynamische Polymorphie Idee: Beim Aufruf einer Methode die Implementierung aus der abgeleiteten Klasse verwenden: Circle c(...); Shape& s_ref = c; s_ref.volume(); // calls Circle::volume() Funktioniert mit virtual Funktionen: class Shape { virtual double volume() const; // always make destructor virtual as well! virtual ~Shape(); }; Methode ist dadurch auch in allen abgeleiteten Klassen virtual. Funktioniert nur mit Pointern / Referenzen: s_ref.volume(); // calls Circle::volume() Shape s_copy = c; s_copy.volume(); // calls Shape::volume()

Dynamische Polymorphie: Pitfalls Keyword virtual ist in abgeleiteten Klassen implizit, aber erlaubt. Methoden-Signatur in abgeleiteten Klassen muss exakt identisch sein, inklusive const-deklarationen: class Circle { // does NOT override the volume() method in Shape! // (we forgot the const) virtual double volume(); } Besser: override, um Tippfehler zu vermeiden: class Circle { double volume() const override; // ok // compile error: no virtual function defined in base class double volume() override; Immer auch den Destruktor virtual machen, ansonsten oft Speicherlücken und ähnliche Probleme!

Dynamische Polymorphie: Fazit Programm entscheidet zur Laufzeit, welche Methode ausgeführt wird. Vorteil: Hohe Flexibilität (die gleiche Funktion kann zur Laufzeit für zwei Objekte unterschiedlichen Typs jeweils die richtige Methode aufrufen). Nachteil: Laufzeit-Overhead (die richtige Methode muß zur Laufzeit identifiziert werden). Erfordert Planung und Disziplin beim Programm-Design: Gemeinsame Hierarchie für alle Klassen. Gemeinsame Funktionalität muß in Basisklasse vorgesehen sein (virtual-deklarationen). Vorhandene Klassen (z.b. aus standard library) nicht integrierbar.