! Nein, weil der implizite Copy-K. die Copy-K.en aller Basisklassen ruft und für die Erweiterung CountedStack shallow copy ausreichend ist:

Ähnliche Dokumente
Objektorientierte Programmierung mit C++

Klassen können auch sogenannte static Member enthalten, diese werden nur einmal pro Klasse angelegt!

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

Häufig verwendete Muster (unter Ausnutzung von Zugriffsrechten)

Objektorientierte Programmierung mit C++

OMSI / Teil 1 / C++ Andreas Blunk. 5. April 2006, Berlin

das Ergebnis kann ohne erneute Umwandlung verwendet werden

1.4. Funktionen. Objektorientierte Programmierung mit C++

Objektorientierte Programmierung mit C Datentypen (Strukturtypen)! p.name = "Willibald Wusel";

Objektorientierte Programmierung mit C++ den sog. default constructor X (){}

Objektorientierte Programmierung mit C Strukturierte Anweisungen: Exception Handling

1.2. Datentypen (Konstantentypen)

Vererbung und Polymorphie

Objektorientierte Programmierung mit C++

Einführung in die Programmierung mit C++

Rückblick: Benutzerdefinierte Datentypen Definition der Klasse Vektor als Container für 2-dimensionale Vektoren

! können default arguments haben: ein Endstück der Argumentliste einer Deklaration mit Wertevorgaben

Initialisierung vs. Zuweisung:

initializer lists (nicht für Referenzen... unklar warum...)

Universität Karlsruhe (TH)

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

Vererbung. Definition Felder Konstruktor Methoden Beispiel. Dr. Beatrice Amrhein

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

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

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

11.3 Virtuelle Methoden

Einführung in das Objektorientierte Programmieren mit C++

11 Vererbung und Klassenhierarchie

3 VERERBUNG ALLGEMEINES

Programmierkurs C/C++

2. Klassen in C++ Um das Klassenkonzept ranken sich alle wichtigen (oo) Konzepte:

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

Pods und Objects (Klassen)

Informatik 1 ( ) D-MAVT F2011. Klassen, Funktionen. Yves Brise Übungsstunde 9

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

19. Vererbung und Polymorphie

Angewandte Mathematik und Programmierung

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

Vererbung. Florian Adamsky, B. Sc. (PhD cand.) Softwareentwicklung im WS 2014/15.

C++11. Objektorientierte Programmierung mit C++ enum classes ("strong enums") sind stark typisiert und scoped :

Grundlagen der Informatik Vererbung von Klassen

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

7. Übung Informatik II - Objektorientierte Programmierung

C++11. exportieren ihre Aufzählungsbezeichner in den umgebenden Bereich (name clashes) schwach typisiert (z.b. keine forward Deklaration möglich)

19. Vererbung und Polymorphie

7. Vererbung und Polymorphie

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

Programmierkurs C/C++

Überblick. Überblick zum weiteren Inhalt

Prinzipien der objektorientierten Programmierung (OOP)

11.3 Virtuelle Methoden

Vererbung Was versteht man unter dem Begriff Vererbung?

18. Vererbung und Polymorphie

Arten von Klassen-Beziehungen

Objektorientierte Programmierung mit C++

18. Vererbung und Polymorphie

Vererbung. Was versteht man unter dem Begriff Vererbung?

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

Die abgeleiteten Klassen Kreis und Viereck erben die Elemente des Basisklasse und verfügen über zusätzliche Eigenschaften (Seitenlänge,

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

Beziehungen zwischen Objekten

Wo und wie lange leben Objekte? globale Objekte lokale Objekte dynamische Objekte

Copy-on-write und Implicit Sharing in Qt

"Roman Jachs" PR Überblick C++ Roman Jachs 5 AHD 1998/99. Überblick C++

A practical guide to C++

Mikrorechentechnik II. Klassen in C++

Informatik I (D-ITET)

Einführung in die Programmierung Wintersemester 2008/09

17. Klassen. Datenkapselung, Klassen, Memberfunktionen, Konstruktoren

Programmieren in C++ Vererbung

Datenkapselung: public / private

OOP. Tagesprogramm. Beziehungen zwischen Typen Vererbung Sichtbarkeit

1.5. Strukturierte Anweisungen

Abstrakte Basisklassen

C++ - Objektorientierte Programmierung Vererbung

C++: Klassen mit Wertsemantik. C++: Klassen mit Wertsemantik. The Rule of Three. Nachtrag: friends

Syntax. int a; public A() {...} public void F() {...} }

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

Th. Letschert OOP 2 2. Geheimnisprinzip und Sichtbarkeitsbeziehungen

Bereits behandelt: Klassen, Konstruktoren, Destruktoren etc. Operatoren. Heute: Namensräume. Vererbung. Kompaktkurs C++ Themen F 1

4. Objektorientierte Programmierung mit C++

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

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

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

Grundkurs C++ IDE Klassenhierarchien

9 Programmieren von Klassen

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Abstrakte Basisklassen

Grundkurs C++ IDE Klassenhierarchien

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

Crashkurs C++ Wiederholung

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

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

Grundkurs C++ IDE Klassenhierarchien

C/C++ - Programmierung. Vererbung Seite 1 von 6. Eine einfache Klasse für eine Personenbeschreibung hat die folgende UML: CPerson.

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

Einführung in die Programmierung mit C++

Kapitel 7.3 Zugreifbarkeit

Herzlich willkommen!

Transkript:

Ist ein (nutzerdefinierter) Copy-Konstruktor erforderlich? Nein, weil der implizite Copy-K. die Copy-K.en aller Basisklassen ruft und für die Erweiterung CountedStack shallow copy ausreichend ist: // implizit bereitgestellt: CountedStack::CountedStack(const CountedStack& other) : Stack(other) {/* real copy */} Der (nutzerdefinierte) Stack-Copy-K. erwartet allerdings eine const Stack&???? 139

Jedes CountedStack - Objekt IST EIN Stack-Objekt CountedStack cs;... cs.pop(); void foo (Stack&);... foo (cs); von der Ableitung zur Basisklasse ist implizit eine Projektion definiert void bar (Stack);... bar(cs); // slicing Stack Δ CountedStack Stack nur bei public Vererbung gilt die IST EIN Relation 140

non-public Vererbung class Deriv1 : private Base {... Deriv1 IST nirgends EIN Base == die Vererbung ist ein (nicht erkennbares) Implementationsdetail class Deriv2 : protected Base {... Deriv2 IST nur in Ableitungen von Deriv2 EIN Base == die Vererbung ist nur Ableitungen Deriv2 von bekannt das Layout von Objekten abgeleiteter Klassen wird von der Art der Vererbung NICHT beeinflusst 141

Zugriffsrechte in C++ class A benutzbar in A private protected public class B : public A benutzbar in B class C : protected B benutzbar in C class D : private C private protected public private protected public benutzbar von außen benutzbar in C private protected public 142

struct ist implizit public, class ist implizit private Depricated: struct erbt implizit public, class erbt implizit private Beim lookup von Funktionsnamen erfolgt overload resolution VOR access check class X { foo(int); public: foo(int, int = 0); int main(){ X x; x.foo(1); //call of overloaded `foo(int)' is ambiguous } 143

Warum besteht bei private-vererbung die IST EIN - Relation nicht? class A { class B : private A { public:... int i; B b; b.i = 1; // ERROR: `class B' has no member named `i' // Wenn ein B ein A wäre: A* pa = &b; pa->i = 1; // sollte aber gerade geschützt werden // ergo, b ist kein A A* pa = &b; // ERROR: `A' is an inaccessible base of `B' 144

Friends oftmals ist die Entscheidung zwischen Alles (public) oder Nichts (private) zu restriktiv --> Möglichkeit, speziellen Klassen/Funktionen Zugriff einzuräumen, indem diese als friend deklariert werden class B { public:void f(class A*); class A { int secret; public: friend void trusted_function(a& a) // globale funktion {... a.secret... } // inline friend B::f(A*); void B::f(A* pa) {... pa->secret...} 145

Friends friend-funktionen sind keine Memberfunktionen der Klasse, die die friend- Rechte einräumt macht man eine ganze Klasse zum friend, werden alle Memberfunktionen dieser zu friends Vorsicht bei unterschiedlichen Kontexten für inline- und outline -Funktionen typedef char* T; class S { typedef int T; friend void f1(t) {... } // void f1(int); friend void f2(t); // void f2(int); void f2(t) {... } // void f2(char*); also kein friend 146

Friends friend-funktionen sind keine Memberfunktionen der Klasse, die die friend- Rechte einräumt macht man eine ganze Klasse zum friend, werden alle Memberfunktionen dieser zu friends Vorsicht bei unterschiedlichen Kontexten für inline- und outline -Funktionen typedef char* T; class S { typedef int T; friend void f1(t) {... } // void f1(int); friend void f2(t); // void f2(int); void f2(t) {... } // void f2(char*); also kein friend 147

Friends Die friend-relation ist nicht symmetrisch, nicht transitiv & nicht vererbbar class ReallySecure { friend class TrustedUser;... class TrustedUser { // can access all secrets class Spy: public TrustedUser { // if friend relation would be inherited: aha Die Position einer friend-deklaration in einem Klassenkörper (private/ protected/public) ist ohne Bedeutung, dennoch sollte man friend-deklarationen in einem public Abschnitt unterbringen (Schnittstelle der Klasse) 148