13. Vererbung. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012)



Ähnliche Dokumente
12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung

Programmieren in Java

Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Einleitende Bemerkungen

Klassenbeziehungen & Vererbung

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Prinzipien Objektorientierter Programmierung

Vererbung & Schnittstellen in C#

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

10. Klassen. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Java: Vererbung. Teil 3: super()

GetName(), GetName(), GetGeschlecht() und AelterWerden().

2. Semester, 2. Prüfung, Lösung

Einführung in die Programmierung

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Vorkurs C++ Programmierung

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Programmieren - Vererbung & Polymorphie

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

5. Abstrakte Klassen

11. Klassen. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012)

Einführung in die Programmierung

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

Objektorientierung: Klassen und Objekte

Objektbasierte Entwicklung

Zählen von Objekten einer bestimmten Klasse

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Einführung in die Programmierung (EPR)

C/C++-Programmierung

Assoziation und Aggregation

3 Objektorientierte Konzepte in Java

4 Vererbung, Polymorphie

Javakurs 2013 Objektorientierung

Klausur in Programmieren

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

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

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Die Programmiersprache C99: Zusammenfassung

Angewandte Mathematik und Programmierung

Von der UML nach C++

Angewandte Mathematik und Programmierung

Applet Firewall und Freigabe der Objekte

Alltagsnotizen eines Softwareentwicklers

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Übungen zu C++ Kapitel 1

Klausur in Programmieren

Objektorientierte Programmierung. Kapitel 12: Interfaces

Klassendiagramm. Kurzer Überblick über UML - Stand BlaBla

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

SEP 114. Design by Contract

Einführung in die C++ Programmierung für Ingenieure

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 16

Software Engineering Klassendiagramme Einführung

Algorithmen und Datenstrukturen

Java Einführung Methoden in Klassen

Klausur C++ #1 Jahr: 2001; Dozent: Dipl.Ing. Sorber

Deklarationen in C. Prof. Dr. Margarita Esponda

Innere Klassen in Java

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Objektorientierte Programmierung OOP

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Kapitel 6. Vererbung

C# im Vergleich zu Java

Abschnitt 12: Strukturierung von Java-Programmen: Packages

Folge 18 - Vererbung

Tutorium Rechnerorganisation

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

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

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Objektorientierte Programmierung mit C++ Zusammenfassung der wichtigsten Topics rund um die objektorientierte Programmierung mit C++11

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

How-to: Webserver NAT. Securepoint Security System Version 2007nx

Java Kurs für Anfänger Einheit 5 Methoden

Objektorientierte Programmierung

Delegatesund Ereignisse

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Installation und Inbetriebnahme von Microsoft Visual C Express

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Codingstandard. Softwareentwicklung Praktikum Stand:

5.6 Vererbung. Vererbung

Einführung in die Java- Programmierung

WPF Steuerelemente Listbox, ComboBox, ListView,

Propädeutikum. Dipl.-Inf. Frank Güttler

Was meinen die Leute eigentlich mit: Grexit?

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Software Engineering Interaktionsdiagramme

Software Engineering Klassendiagramme Assoziationen

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

Whitebox-Vererbung vs. Blackbox-Vererbung. - Begriffsbestimmung - Vererbung öffentliche Vererbung private Vererbung - Zusammenfassung

Testen mit JUnit. Motivation

DLLs (dynamic loaded libraries) mit MingW erstellen

1 Vom Problem zum Programm

Transkript:

13. Vererbung Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012) Vererbung Konzept Protected Section Virtuelle Mitgliedsfunktionen Verwendung von Vererbung

Vererbung Vererbung ist ein Mechanismus, der es erlaubt, aus bestehenden Klassen neue spezialisierte Klassen abzuleiten Zusätzliche Funktionalität Zusätzliche Daten Veränderung von Methoden der übergeordneten Klasse Die übergeordnete Klasse heisst auch Basisklasse Die untergeordnete Klasse heisst auch abgeleitete Klasse 2

Beispiel_1: Bank-Klasse (Prata S. 724) // bankacct.h -- a simple BankAccount class #ifndef _BANKACCT_H_ #define _BANKACCT_H_ class BankAccount private: enum MAX = 35; char fullname[max]; long acctnum; double balance; public: BankAccount(const char *s = "Nullbody", long an = -1, double bal = 0.0); void Deposit(double amt); void Withdraw(double amt); double Balance() const; void ViewAcct() const; ; #endif 3

Beispiel_1: Bank-Klasse (Prata S. 727) // bankacct.cpp -- methods for BankAccount class - Auszug #include <iostream> using namespace std; #include "bankacct.h" #include <cstring> BankAccount::BankAccount(const char *s, long an, double bal) strncpy(fullname, s, MAX - 1); fullname[max - 1] = '\0'; acctnum = an; balance = bal; void BankAccount::Deposit(double amt) balance += amt; void BankAccount::Withdraw(double amt) if (amt <= balance) balance -= amt; else cout << "Withdrawal amount of $" << amt << " exceeds your balance.\n" << "Withdrawal canceled.\n"; double BankAccount::Balance() const return balance; 4

Beispiel_1: Bank-Klasse // usebank.cpp // compile with bankacct.cpp #include <iostream> using namespace std; #include <cstring> #include "bankacct.h" int main() BankAccount Porky("Porcelot Pigg", 381299, 4000.00); Porky.ViewAcct(); Porky.Deposit(5000.00); cout << "New balance: $" << Porky.Balance() << endl; Porky.Withdraw(8000.00); cout << "New balance: $" << Porky.Balance() << endl; Porky.Withdraw(1200.00); cout << "New balance: $" << Porky.Balance() << endl; return 0; 5

Basisklasse Von der Basisklasse BankAccount kann nun eine abgeleitete Klasse definiert werden Diese erbt die Methoden und Daten der Basisklasse C++ kennt 3 Arten von Vererbung: public, private, protected Public Vererbung (Inheritance) modelliert eine Ist- Beziehung Die abgeleitete Klasse hat vollen Zugriff auf alle öffentlichen Methoden und Daten der Basisklasse Beispiel: Banane ist-eine Frucht (Is-a relation) Gegenbeispiel: Lunch hat eine Frucht (has-a relation) Kann durch Einbeziehung von anderen Klassen erfolgen (Containment) 6

Abgeleitete Klassen Bei Deklaration einer abgeleiteten Klasse wird Klassenname der Basisklasse sowie Vererbungstyp nachgestellt class Overdraft : public BankAccount; Public Members der Basisklasse werden public Members der abgeleiteten Klasse Private Daten der Basisklasse können nur über public Interface verwendet werden Ohne Angabe des Typs ist die Vererbung private Bei der Instantiierung wird zunächst der Basiskonstruktor aufgerufen, dann derjenige der abgeleiteten Klasse Umgekehrt bei Destruktorenaufruf 7

Abgeleitete Klassen Bei private Inheritance gehen Daten und Methoden der public und protected Section der Basisklasse in die private Section der abgeleiteten Klasse über Class Overdraft : private BankAccount; Methoden werden also nicht Teil des public Interface der Klasse Es wird jedoch die Implementierung vererbt Abgeleitete Klasse kann somit Methoden der Basisklasse für eigene Implementierungen verwenden, aber nicht nach aussen sichtbar machen Diese Methoden können NICHT weitervererbt werden 8

Abgeleitete Klassen Bei protected Inheritance gehen Daten und Methoden der public und protected Section der Basisklasse in die protected Section der abgeleiteten Klasse über Wie private, jedoch weitervererbbar Bedeutend bei Mehrfachvererbung Public oder protected Members sind von der abgeleiteten Klasse aus zugreifbar friend Funktionen können nicht vererbt werden Methoden der Basisklasse können dabei überschrieben werden 9

Konstruktoren Eine abgeleitete Klasse benötigt geg. eigene Konstruktoren Vor deren Aufruf, muss jedoch der Basisklassenkonstruktor aufgerufen werden Problem: Korrekte Initialisierung Beispiel: Konstruktor zu Overdraft soll auch Mitgliedsvariablen der Basisklasse initialisieren Overdraft(const char *s = Nullbody, long an = -1, double bal = 0.0, double ml = 500, double r = 0.10); 3 der Argumente sind für Basisklasse bestimmt Basisklassenkonstruktor (default constructor) wird vorab aufgerufen Overdraft::Overdraft(const char *s, long an, double bal, double ml, double r) : BankAccount(s, an, bal) 10

Beispiel_2: Overdraft (Prata S. 728) // overdraft.cpp -- Overdraft class methods #include <iostream> using namespace std; #include "overdraft.h" Overdraft::Overdraft(const char *s, long an, double bal, double ml, double r) : BankAccount(s, an, bal) maxloan = ml; owesbank = 0.0; rate = r; Overdraft::Overdraft(const BankAccount & ba, double ml, double r) : BankAccount(ba) // uses default copy constructor maxloan = ml; owesbank = 0.0; rate = r; 11

Beispiel_2: Overdraft (Prata S. 728) // redefine how ViewAcct() works void Overdraft::ViewAcct(int n) const cout << n << endl; // set up ###.## format ios_base::fmtflags initialstate = cout.setf(ios_base::fixed, ios_base::floatfield); cout.setf(ios_base::showpoint); cout.precision(2); BankAccount::ViewAcct(); // display base portion cout << "Maximum loan: $" << maxloan << endl; cout << "Owed to bank: $" << owesbank << endl; cout.setf(initialstate); 12

Beispiel_2: Overdraft (Prata S. 729) // redefine how Withdraw() works void Overdraft::Withdraw(double amt) // set up ###.## format ios_base::fmtflags initialstate = cout.setf(ios_base::fixed, ios_base::floatfield); cout.setf(ios_base::showpoint); cout.precision(2); double bal = Balance(); if (amt <= bal) BankAccount::Withdraw(amt); else if ( amt <= bal + maxloan - owesbank) double advance = amt - bal; owesbank += advance * (1.0 + rate); cout << "Bank advance: $" << advance << endl; cout << "Finance charge: $" << advance * rate << endl; Deposit(advance); BankAccount::Withdraw(amt); else cout << "Credit limit exceeded. Transaction canceled.\n"; cout.setf(initialstate); 13

Beispiel_2: Overdraft // useover.cpp -- test Overdraft class // compile with bankacct.cpp and overdraft.cpp #include <iostream> using namespace std; #include "overdraft.h" int main() BankAccount Porky("Porcelot Pigg", 381299, 4000.00); // convert Porcelot to new account type Overdraft Porky2(Porky); Porky2.ViewAcct(1); cout << "Depositing $5000:\n"; Porky2.Deposit(5000.00); cout << "New balance: $" << Porky2.Balance() << "\n\n"; cout << "Withdrawing $8000:\n"; Porky2.Withdraw(8000.00); cout << "New balance: $" << Porky2.Balance() << "\n\n"; cout << "Withdrawing $1200:\n"; Porky2.Withdraw(1200.00); Porky2.ViewAcct(3); cout << "\nwithdrawing $500:\n"; Porky2.Withdraw(500.00); Porky2.ViewAcct(3); Porky2.ResetOwes(); cout << endl; Porky2.ViewAcct(4); return 0; 14

Dynamic Binding Im Beispiel wird die Methode ViewAccount() von der abgeleiteten Klasse überschrieben Beispiel: Pointer auf Basisklassenobjekt BankAccount bretta; BankAccount *bp = &bretta; bp->viewacct(); // BankAccount::ViewAcct() Overdraft ophelia; bp = &ophelia; // zulässig bp->viewacct(); // unklar, welche Funktion Von sich aus nimmt C++ die Methode der Basisklasse Dies mag nicht immer wünschenswert sein Wir benötigen eine dynamische Anbindung der aufzurufenden Funktion zur Laufzeit 15

Dynamic Binding Feste Anbindung des Funktionscodes an den Aufruf zur Compilezeit heisst statische Anbindung (static, early binding) Anbindung des Funktionscodes an den Aufruf zur Laufzeit heisst dynamische Anbindung (dynamic, late binding) Bei statischer Anbindung wird im Beispiel die Basisklassenfunktion aufgerufen bp = &ophelia; bp->viewacct(); // BankAccount::ViewAcct() Bei dynamischer Anbindung wird im Beispiel die Funktion der abgeleiteten Klasse aufgerufen bp = &ophelia; bp->viewacct(); // Overdraft::ViewAcct() 16

Dynamic Binding Dynamische Anbindung wird mit dem Schlüsselwort virtual aufgerufen (muss bei der Deklaration in der Basisklasse angegeben werden, darf auch bei der abgeleiteten Klasse angegeben werden) virtual void ViewAcct() const; Aus Effizienzgründen sollte dynamische Anbindung behutsam angewandt werden Faustregel: Wenn Funktion in abgeleiteter Klasse neu definiert wird, dann sollte sie als virtual deklariert werden, andernfalls nicht! Dynamische Anbindung nicht mit Funktionsüberladung verwechseln!! 17