Zurück

Objektorientierte Programmierung

Übungen

Übung 4-1

Elementare Vererbung

Nachstehend und abrufbar als Datei finden Sie ein sehr elementares Vererbungsszenario mit zwei kleinen Klassen A und B.

  1. Compilieren Sie diese Datei und führen Sie das Programm einmal aus.
  2. Zerlegen Sie den Code in mehrere Dateien: jede Klassendeklaration soll in einer Headerdatei (A.h, B.h) gespeichert werden, die Implementierungen kommen in die entsprechenden C++-Dateien (A.cpp, B.cpp); schließlich wird das Hauptprogramm in main.cpp abgelegt.
    Erstellen Sie nun auf dieser Grundlage wiederum das ausführbare Gesamtprogramm.
  3. Im zweiten Konstruktor von B wird auf das Attribut a aus der Elternklasse A zugegriffen.
    Weshalb funktioniert dies?
    Sehen Sie dennoch hierin ein Problem?

// inherit01.cpp - Kleine Demonstration fuer Vererbung in C++

#include <iostream>  
#include <cstdlib>

using namespace std;

// -- Deklaration Klasse A
class A
{
    protected:
        int a;
    public:
        A();
        A(int);
        void ausgabe();
};


// -- Deklaration Klasse B
class B : public A
{
    private:
        int b;
    public:
        B();
        B(int, int = 0);
        void ausgabe();
};

// -- Implementierung Klasse A
A::A()
{
    a = 0;
}

A::A(int a)
{
    this->a = a > 0 ? a : 0;
}

void A::ausgabe()
{
    cout << "a: " << a;
}


// -- Implementierung Klasse B
B::B() 
{
    b = 0;
}

B::B(int a, int b) 
{
    this->a = a;
    this->b = b > 0 ? b : 0;
}

void B::ausgabe()
{
    A::ausgabe();
    cout << "  b: " << b;
}


int main()
{
    A a1, a2(50);
    B b1, b2(100,200);

    a1.ausgabe();
    cout << endl;
    a2.ausgabe();
    cout << endl;
    b1.ausgabe();
    cout << endl;
    b2.ausgabe();
    cout << endl;

    return EXIT_SUCCESS;
    
} // end main

// end inherit01.cpp

Übung 4-2

Vererbung

Falls Sie Übungsbedarf in Java haben sollten, migrieren Sie das in der vorherigen Aufgabe gezeigte C++-Programm bitte nach Java.

Übung 4-3

Vererbung

Implementieren Sie bitte folgendes Szenario.

In einem Unternehmen gibt es Abteilungen und Mitarbeiter. Der Einfachheit halber gebe es zunächst nur die Abteilungen "Einkauf", "Vertrieb", "Personal" und "Entwicklung". Jede/r der Mitarbeiter/innen des Unternehmens muss (umgangssprachlich) zu genau einer der folgenden Gruppen gehören.

  1. (Normale) Angestellte: Hier werden exemplarisch der Vor- und Nachname, das Geburtsdatum, das Gehalt (als float-Wert) und die Abteilung, zu der er oder sie gehört, festgehalten.
  2. Abteilungsleiter/innen: Hier werden neben dem Vor- und Nachnamen, dem Geburtsdatum, dem Gehalt (wiederum als float-Wert) und der Abteilung, die er oder sie leitet, auch die Autonummer des Dienstwagens verwaltet.
  3. Abteilungsübergreifendes ("Allround-")Personal (z.B. Hausmeister): Hier werden Vor- und Nachname, Geburtsdatum und das Gehalt gespeichert.
  4. Vorstand und Geschäftsführung: Zu den dem Vorstand bzw. der Geschäftsführung des Unternehmens angehörenden Personen werden die folgenden Attribute verwaltet: Vor- und Nachname, Geburtsdatum, Gehalt, der/die persönlich zugeordnete Sekretär/in sowie der/die persönlich zugeordnete Fahrer/in.

Implementieren Sie die erforderlichen Klassen in sinnvoller Weise, schreiben Sie sich - jeweils in Java und in C++ - ein Probe-Hauptprogramm bzw. eine Demo-Klasse zum Testen dieser Klassen, und erläutern Sie insbesondere, wo Sie Vererbung eingesetzt und wo "Layering" genutzt haben. ("Layering" bedeutet, dass man eine Klasse als Datentyp für eine Komponente in einer weiteren Klasse nutzt.)

Übung 4-4

Die Klassen Person und Student Vererbung: Personen und Studierende

In der Vorlesung wurden die Klassen Person und Student angesprochen. Sofern noch nicht geschehen, implementieren Sie diese beiden Klassen bitte in C++ (und, falls Ihnen die Zeit reichen sollte, auch in Java).
Erweitern Sie die Klasse Person bitte um einen Operator operator== (C++) bzw. eine Methode equals() (Java) zur Überprüfung zweier Objekte dieser Klasse auf inhaltliche Gleichheit. - Können Sie damit auch Objekte der Klasse Student auf Gleichheit prüfen? Was stellen Sie fest?


Übung 4-5

Vererbung: Design und Realisierung

Modellieren Sie bitte Konten, Girokonten und Sparkonten (unter Zuhilfenahme der Vererbung).
Ein Konto habe genau einen Inhaber, i.e. eine Person mit den üblichen Attributen, genau eine maximal zehnstellige Kontonummer (rein numerisch, wobei auch die ersten Stellen '0' sein dürfen) sowie einen Kontostand. (Wir vereinfachen die Modellierung hier gegenüber der realen Bankenpraxis bewusst.)

Ein Girokonto ist ein Konto, das einen geduldeten überziehungsrahmen ("Dispo") besitzt, das mit einem jährlichen Zinssatz p1 im Guthabenbereich verzinst wird, das innerhalb des geduldeten überziehungsrahmen im Minus mit dem Zinssatz p2 belastet wird, und wird der Negativsaldo auf dem betreffenden Konto betragsmäßig größer als dieser überziehungsrahmen, dann wird ein Zinssatz p3 zur Verzinsung herangezogen. Außerdem verfüge ein Girokonto bei der von uns zu modellierenden Bank über ein Kennzeichen, welcher Gebührentarif für diese Konto gelten soll. Dieses Kennzeichen kann als ganzzahlig-positiv angenommen werden. (So könnte etwa 0 für Standard-Arbeitnehmer-Giro-Konto, 1 für Studenten-Konto mit geringerer Monatspauschale usw. stehen.)

Ein Sparkonto ist ein Konto, für das ein Guthabenzinssatz verwaltet werden muss. Außerdem kann ggf. eine Kündigungssperrfrist angegeben sein, ebenso möglicherweise ein (frühestes) Fälligkeitsdatum.

Skizzieren Sie die Sachverhalte zunächst (Klassenmodellierung) und implementieren Sie anschließend in Java und in C++. Testen Sie bitte wieder mit einer kleinen Demo-Klasse (in Java) bzw. in C++ mit einem eigenen kleinen Hauptprogramm.


© 1999-2023 FHDW/Peter Baeumle-Courth. Document-Id: fhdwbap:opg:027920-2