3 VERERBUNG ALLGEMEINES

Ähnliche Dokumente
1 KLASSENKOMPONENTEN. Leitideen: Klassen sind aus Datenkomponenten und Komponentenfunktionen

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

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

Grundkurs C++ IDE Klassenhierarchien

Grundkurs C++ IDE Klassenhierarchien

Einstieg in die Informatik mit Java

Grundkurs C++ IDE Klassenhierarchien

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

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

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

6 ZEIGER UND REFERENZEN - ALLGEMEINES

Einstieg in die Informatik mit Java

Vererbung, Polymorphie

Objektorientierte Programmierung mite**

11 Vererbung und Klassenhierarchie

Praxis der Programmierung

Vorlesung Datenstrukturen

Grundlagen der Informatik

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

Prinzipien der objektorientierten Programmierung (OOP)

C++ - Objektorientierte Programmierung Vererbung

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

Mikrorechentechnik II. Klassen in C++

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

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

Programmierpraktikum 3D Computer Grafik

Vererbung Was versteht man unter dem Begriff Vererbung?

3D Programmierpraktikum: Einführung in C++ - Teil 2

Vererbung. Was versteht man unter dem Begriff Vererbung?

C++ - Objektorientierte Programmierung Polymorphie

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

7. Übung Informatik II - Objektorientierte Programmierung

Einstieg in die Informatik mit Java

Objektorientierte Programmierung III

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

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

Vorkurs Informatik: Erste Schritte der Programmierung mit C++

Einstieg in die Informatik mit Java

Einführung in die Systemprogrammierung

11.3 Virtuelle Methoden

Überblick. Überblick zum weiteren Inhalt

Einführung in die Programmierung mit C++

Einführung in das Objektorientierte Programmieren mit C++

Vorlesung Datenstrukturen

2 FUNKTIONSZEIGER UND BEHÄLTER

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

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

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

Prof. W. Henrich Seite 1

Programmieren in C+ Einführung in den Sprachstandard C++ Springer-Verlag Berlin Heidelberg New York London Paris Tokyo Hong Kong Barcelona Budapest

Klassen können bekanntlich aus zwei Komponententypen bestehen, nämlich Attributen und Methoden.

Lehrstuhl für Datenverarbeitung. Technische Universität München. Grundkurs C++

Programmierung III. Pointer für Fortgeschrittene Marc Ruberg. Arrays von Pointern ( Zeigervektoren ): Pointer auf Pointer:

Herzlich willkommen!

11.3 Virtuelle Methoden

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

Programmierung und Angewandte Mathematik

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

Peter Prinz Ulla Kirch-Prinz C+ + Lernen und professionell anwenden. ffl mitp

Lehrstuhl für Datenverarbeitung. Technische Universität München. Grundkurs C++

Objektorientiertes Programmieren in C++

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

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

6 ZEIGERARITHMETIK - ALLGEMEINES

Einführung in die Programmierung mit C++

Programmieren in C++ Vererbung

Kapitel 11: Vererbung Ziele von Klassen Einführung in die Informatik für struct Naturwissenschaftler und Ingenieure

Objektorientierte Programmierung und Klassen

Objektorientiertes Programmieren

Typsystem Plattform- und Sprachenunabhängigkeit in.net

Einstieg in die Informatik mit Java

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

C/C++-Programmierung

Das Interface-Konzept am Beispiel der Sprache Java

Vererbung und Polymorphie

Objektorientiert in C++

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

Einstieg in die Informatik mit Java

Lehrstuhl für Datenverarbeitung. Technische Universität München. Grundkurs C++

Vorwort zur zweiten Auflage 1. Vorwort zur ersten Auflage 2

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

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

Ableiten konkreter Klassen

Einführung in C++ Vererbung und Polymorphismus

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

Ableiten konkreter Klassen

Exceptions und Vererbung

Vererbung, Polymorphismus

Objektorientierte Programmierung mit C++ SS 2007

Grundlagen der Informatik Vererbung von Klassen

HSR Rapperswil 2001 Markus Rigling. Programmieren: Smart Pointer Auflage

C++ Teil 10. Sven Groß. 17. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Dez / 14

Einführung in das Objektorientierte Programmieren mit C++

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

Programmieren 2 C++ Überblick

Objektorientierte Sprachen

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Transkript:

3 VERERBUNG ALLGEMEINES Leitideen: Die Hinzufügung von Daten- oder Funktionskomponenten zu einer vorhandenen Klasse (Basisklasse) wird als Vererbung und die auf diese Weise erzeugte Klasse als abgeleitete Klasse bezeichnet. Die privaten Komponenten der Basisklasse sind vor dem Direktzugriff aus der abgeleiteten Klasse geschützt, um ein Aushebeln des Klassenkonzepts zu verhindern. Die Vorrangregel für gleichnamige Komponenten der abgeleiteten Klasse ermöglicht das Überschreiben der nichtprivaten Komponentenfunktionen der Basisklasse. Durch den Mechanismus der Vererbung ist die Weiterbenutzung der hinzugefügten Funktionalität möglich, auch wenn sich die Implementierung der Basisklasse ändert.

3 VERERBUNG ALLGEMEINES II Leitideen: Gelegentlich sollen Objekte abgeleiteter Klassen einheitlich als Basisklassenobjekte behandelt werden (Polymorphismus). Virtuelle Funktionen in der Basisklasse ermöglichen den korrekten Aufruf von Komponentenfunktionen abgeleiteter Klassen, weil im Objekt ein Index in eine Tabelle von Funktionszeigern gespeichert wird. Das funktioniert allerdings nur für den Zugriff über Zeiger oder Referenzen. Die Implementierung virtueller Funktionen in der Basisklasse kann vermieden werden (rein virtuelle Funktionen). Dann können allerdings keine Basisklassenobjekte, sondern lediglich Basisklassentypzeiger und -referenzen mit Verweisen auf konkrete Objekte abgeleiteter Klassen gebildet werden (abstrakte Klassen).

3 VERERBUNG THEMENÜBERSICHT Vererbung - Begriff, Zweck, Prinzip Vererbung - Attribute Vererbung - Gleichnamige Komponenten Vererbung - Konstruktoren, Destruktoren Virtuelle Funktionen - Zweck Virtuelle Funktionen - Realisierung Virtuelle Funktionen - Zusammenfassung Rein virtuelle Funktionen, abstrakte Klassen Virtuelle Destruktoren

Vererbung - Begriff, Zweck, Prinzip Begriff: Erweiterung einer Klasse ( abgeleitete Klasse ) um die Komp. einer bereits definierten Klasse ( Basisklasse ) [Objekte der abgeleiteten Klasse haben mindestens so viele Datenkomp. wie die Objekte der Basisklasse] Zweck: Prinzip: Vermeidung von Mehrfachdef., automat. Übernahme von Änderungen der Basisklasse in die abgeleitete Klasse Gleichnamige Komp. der abgeleit. Klasse haben Vorrang vor denen der Basisklasse (gilt für Daten- und Fkt.komp.) Private Komponenten der Basisklasse nicht zugreifbar, andere Basisklassenkomp. je nach Art der Ableitung. Zuerst Initial. der Basisklassenkomp., danach restliche. Explizit durch Angabe des Basiskl.konstr. in der Initial.liste. Implizit durch automat. Aufruf der Basiskl.-Standardkonstr. Keine Vererbung der Basisklassenkonstr./destruktoren. Implizite Typumwandlung abgeleit. Klasse. Basisklasse okay, weil in Basiskl. nicht mehr Komp. (Keine Umkehrung!)

Vererbung - Attribute Art der Ableitung (public, protected, private) bestimmt Zugriffsrechte auf Basisklassenkomponenten für die abgeleitete Klasse Am wichtigsten public-ableitung: Schränkt nur den Zugriff auf private Basisklassenkomponenten ein Private Komponenten der Basisklasse werden nicht zu privaten Komponenten der abgeleiteten Klasse. Sonst: Direkter Zugriff auf Komponenten einer Klasse durch nicht von der Klasse autorisierte Funkt. möglich (Zugriffsschutz von privaten Komponenten ginge verloren, Datenkapselung wäre weitgehend aufgehoben.) Basisklasse kann den Zugriff auf ihre privaten Komp. per friend-deklaration für einzelne abgeleitete Klassen erlauben (selten verwendet) Alternativ: Komponenten als protected statt private kennzeichnen. [Abgeleitete Klassen dürfen auf als protected gekennzeich. Komp. der Basisklasse zugreifen]

Vererbung - gleichnamige Komponenten In der abgeleiteten Klasse können gleichnamige Komp. wie in der Basisklasse definiert werden: Bsp.: struct Base {int a,b,c,d}; struct Derived : Base {int d,e,f,g}; // Base: 4 Komp. Derived: 8 Komp. In Objekten der abgeleiteten Klasse: Vorrang der Komp. der abgeleiteten Klasse vor den Komp. der Basisklasse Bsp.: Base base; Derived derived; derived.d; Base::derived.d; // Komp. d von Derive // Komp. d von Base Überdecken von Komponentenfunktionen häufiger als Überdecken von Datenkomponenten Bsp.: Base/Derived mit Zugriffsattributen Inf.bl.13, S.1 Vektordatentyp mit Bereichsüberprüfung Inf.bl.13, S.3

Vererbung - Konstruktoren/Destruktoren Keine Vererbung der Konstruktoren und Destruktoren der Basisklasse. Sonst u. U. nur partielle Initialisierung von Objekten der abgeleiteten Klasse (d.h. lediglich Komponenten der Basisklasse werden initialisiert). Deshalb auch keine Vererbung der Funktion operator= Verwendung von Basisklassenkonstruktoren in Konstruktorinitialisierungsliste erlaubt und sinnvoll Initialisierung der Basisklassenkomponenten erfolgt vor der der übrigen Komponenten, ggf. mit Standardkonstruktoren Aufruf der Destruktoren in umgekehrter Reihenfolge

Virtuelle Funktionen - Zweck Abgeleitete Klasse als Spezialisierung der Basisklasse: Spezialisierung durch Hinzufügung weiterer (auch gleichnamiger) Komponenten Gelegentlich wünschenswert: Eine Reihe von Objekten aus einer Basisklasse und davon abgeleiteten Klassen einheitlich behandeln. ( Polymorphismus ) Bsp.: struct Base {void f(){}}; struct Derived : Base {void f(){}}; list<base> bl; Derived d; bl.push_back(d); // Typumw (Base)d okay jedoch: bl.front().f() ruft falsches f() auf! Typumw. Derived Base zulässig (weniger Komp.!) Base Derived unzulässig (mehr Komp.!) Lösung dieses Problems durch virtuelle Funktionen

Virtuelle Funktionen - Realisierung Typumwandlungen sind am flexibelsten für Zeigertypen. Bsp.: struct Base {void f(){}}; struct Derived : Base {void f(){}}; list<base*> bpl; Derived d; bpl.push_back(&d); // Typumw (Base*)&d ok immer noch: bpl.front()->f() ruft falsches f() auf! Abhilfe: virtual void f() statt void f() in Base Erschließen der richtigen Funktion f() dann allein aus der Adresse des Datenobjekts möglich, weil für virtuelle Funktionen zusätzlich ein Index in eine Funktionszeigertabelle gespeichert wird. Hintergrund: Objekte von Klassen ohne virtuelle Funktionen enthalten nur Datenkomponenten. Deshalb Objekttyp wichtig für Auswahl gleichnamiger nicht virtueller Komponentenfunktionen.

Virtuelle Funktionen - Zusammenfassung Regel: Der Datentyp eines Klassenobjekts entscheidet, welche der gleichnamigen Komponentenfunktionen mit derselben Parametertypliste ausgewählt wird. Ausnahme: Komponentenfunktion der abgeleiteten Klasse wird ausgewählt, wenn: 1. Komponentenfunktion in der Basisklassse als virtual definiert und 2. Zugriff auf Objekt der abgeleiteten Klasse über Basisklassenzeiger bzw. -referenz erfolgt Hintergrund: Typumwandlung Derived Base entfernt Komponenten von Derived, Änderung des Zeigers auf virtuelle Funktionstabelle aus Konsistenzgründen erforderl. Typumwandlung Derived* Base* bzw. Derived& Base& lässt Bitmuster (bei übl. Klassenlayout) ungeändert. Ergänzung: Geerbte virtuelle Funktionen in abgeleiteter Klasse automat. virtuell (auch ohne virtual-deklaration)

Rein virtuelle Funktionen, Abstrakte Klassen Rein virtuelle Funktion: Virtuelle Funktion, bei der der Funktionsrumpf durch =0 ersetzt ist Abstrakte Klasse: Klasse mit mindestens einer rein virtuellen Funktion Abstrakte Klassen können keine Objekte enthalten! Auch als Parameter- oder Ergebnistyp von Funktionen unzulässig Zeiger oder Referenzen auf abstrakte Klassen erlaubt Bildung abgeleiteter Klassen (mit Objekten!) möglich Abstrakte Klasse oft Ausgangspunkt einer Klassenhierarchie Polymorphismus also auch in C++ möglich, aber etwas umständlich wegen Verwendung von Zeigern oder Referenzen C++ kennt auch Mehrfachvererbung hier nicht behandelt

Virtueller Destruktor Zweck: Vermeidung von Speicherlecks in bestimmten Situationen Beim Löschen von dynamisch allozierten Objekten wird die statische Typinformation benutzt, wenn kein virtueller Destruktor benutzt wird. Bsp.: struct Base {int a;}; struct Derived : Base {int b;}; Base *p = new Derived delete p; // Wuerde nur 4B statt // 8B freigeben Ähnlich wie bei virtuellen Funktionen ist in dieser Situation ein virtueller Destruktor erforderlich. (Im C++-Standard vorgeschrieben!) Bsp.: struct Base { int a; virtual ~Base() {} }; // Restliche Zeilen unveraendert Regel: Bei Klassen mit virtuellen Funktionen auch virtuellen Destruktor definieren.