🎓 Informationen zur Klausur 🎓

Wissensspeicher 18

Vorher

  • Statisches Binden: Zur Übersetzungszeit steht aufgerufene Methode fest
  • Umgangssprachlich: „Anhand des Typs einer Variablen wird aufzurufende Funktion bestimmt”

Virtuelle Methoden

  • Dynamisches Binden: Zur Ausführungszeit wird die Methode ermittelt
  • „Zur Laufzeit wird geschaut, welchen Typ ein Objekt wirklich hat und dessen Variante einer Funktion ausgeführt”
  • Erfordert Einfügen des Schlüsselworts virtual vor die Funktionsdeklaration in der Basisklasse
  • Rein virtuelle Methoden (pure virtual) erzwingen die Implementierung in Unterklasse: virtual int foo() = 0;
  • Klassen mit rein virtuellen Methoden nennt man abstrakte Klassen → können nicht instanziiert werden

pages/Kapitel12-page-01.svg

pages/Kapitel12-page-02.svg

pages/Kapitel12-page-03.svg

pages/Kapitel12-page-04.svg

pages/Kapitel12-page-05.svg

pages/Kapitel12-page-06.svg

pages/Kapitel12-page-07.svg

pages/Kapitel12-page-08.svg

pages/Kapitel12-page-09.svg

pages/Kapitel12-page-10.svg

pages/Kapitel12-page-11.svg

pages/Kapitel12-page-12.svg

pages/Kapitel12-page-13.svg

pages/Kapitel12-page-14.svg

pages/Kapitel12-page-15.svg

pages/Kapitel12-page-16.svg

pages/Kapitel12-page-17.svg

pages/Kapitel12-page-18.svg

pages/Kapitel12-page-19.svg

pages/Kapitel12-page-20.svg

pages/Kapitel12-page-21.svg

pages/Kapitel12-page-22.svg

pages/Kapitel12-page-23.svg

pages/Kapitel12-page-24.svg

pages/Kapitel12-page-25.svg

pages/Kapitel12-page-26.svg

pages/Kapitel12-page-27.svg

pages/Kapitel12-page-28.svg

pages/Kapitel12-page-29.svg

pages/Kapitel12-page-30.svg

pages/Kapitel12-page-31.svg

pages/Kapitel12-page-32.svg

pages/Kapitel12-page-33.svg

pages/Kapitel12-page-34.svg

pages/Kapitel12-page-35.svg

pages/Kapitel12-page-36.svg

pages/Kapitel12-page-37.svg

pages/Kapitel12-page-38.svg

pages/Kapitel12-page-39.svg

pages/Kapitel12-page-40.svg

pages/Kapitel12-page-41.svg

pages/Kapitel12-page-42.svg

pages/Kapitel12-page-43.svg

pages/Kapitel12-page-44.svg

Live-Demo - Ausnahme bei Division

#include <iostream>

using namespace std;

int division(int a, int b) {
    if (b  == 0) {
        throw "Division durch Null";
    }
    return a/b;
}

int main() {
    try {
        cout << "10/3=" << division(10,3) << endl;
        cout << "12/0=" << division(12,0) << endl;
        cout << "14/5=" << division(14,5) << endl;
    }
    catch (char const* message) {
        cout << message << endl; // Lieber cerr nehmen!
    }

    cout << "Divisionen ausgeführt." << endl;

	return 0;
}
compiler

pages/Kapitel12-page-45.svg

pages/Kapitel12-page-46.svg

pages/Kapitel12-page-47.svg

pages/Kapitel12-page-48.svg

pages/Kapitel12-page-49.svg

pages/Kapitel12-page-50.svg

pages/Kapitel12-page-51.svg

pages/Kapitel12-page-52.svg

pages/Kapitel12-page-53.svg

pages/Kapitel12-page-54.svg

pages/Kapitel12-page-55.svg

pages/Kapitel12-page-56.svg

pages/Kapitel12-page-57.svg

pages/Kapitel12-page-58.svg

pages/Kapitel12-page-59.svg

pages/Kapitel12-page-60.svg

pages/Kapitel12-page-61.svg

pages/Kapitel12-page-62.svg

pages/Kapitel12-page-63.svg

pages/Kapitel12-page-64.svg

pages/Kapitel12-page-65.svg

pages/Kapitel12-page-66.svg

pages/Kapitel12-page-67.svg

pages/Kapitel12-page-68.svg

pages/Kapitel12-page-69.svg

Live-Demo - Mehrere Ausnahmen

#include <iostream>

using namespace std;

class MathError {};
class Overflow: public MathError {};
class SpecialOverflow: public Overflow {};

void schwierigeRechnung(){
    throw SpecialOverflow();
}

int main() {
    try {
        schwierigeRechnung();
    }
    catch (Overflow) {
        cout << "Gefangen: Overflow" << endl;
    }
    catch (SpecialOverflow) {
        cout << "Gefangen: SpecialOverflow" << endl;
    }
    catch (MathError) {
        cout << "Gefangen: MathError" << endl;
    }

	return 0;
}
compiler

pages/Kapitel12-page-70.svg

pages/Kapitel12-page-71.svg

pages/Kapitel12-page-72.svg

pages/Kapitel12-page-73.svg

pages/Kapitel12-page-74.svg

pages/Kapitel12-page-75.svg

pages/Kapitel12-page-76.svg

pages/Kapitel12-page-77.svg

pages/Kapitel12-page-78.svg

Live-Demo - Ausnahmen mit Resterampe

#include <iostream>

using namespace std;

class MathError {};
class Overflow: public MathError {};
class SpecialOverflow: public Overflow {};

void schwierigeRechnung(){
    throw SpecialOverflow();
}

int main() {
    try {
        schwierigeRechnung();
    }
    catch (SpecialOverflow) {
        cout << "Gefangen: SpecialOverflow" << endl;
    }
    catch (Overflow) {
        cout << "Gefangen: Overflow" << endl;
    }
    catch (MathError) {
        cout << "Gefangen: MathError" << endl;
    }
    catch (...) {
        // fängt alles andere
        cout << "Ausnahme \"...\" gefangen" << endl;
    }

	return 0;
}
compiler

pages/Kapitel12-page-79.svg

pages/Kapitel12-page-80.svg

pages/Kapitel12-page-81.svg

pages/Kapitel12-page-82.svg

pages/Kapitel12-page-83.svg

pages/Kapitel12-page-84.svg

pages/Kapitel12-page-85.svg

pages/Kapitel12-page-86.svg

pages/Kapitel12-page-87.svg

pages/Kapitel12-page-88.svg

pages/Kapitel12-page-89.svg

pages/Kapitel12-page-90.svg

pages/Kapitel12-page-91.svg

pages/Kapitel12-page-92.svg

pages/Kapitel12-page-93.svg

pages/Kapitel12-page-94.svg

pages/Kapitel12-page-95.svg

pages/Kapitel12-page-96.svg

pages/Kapitel12-page-97.svg

pages/Kapitel12-page-98.svg

pages/Kapitel12-page-99.svg

pages/Kapitel12-page-100.svg

Live-Demo - Ausnahmen mit Polymorphie

#include <iostream>

using namespace std;

class MeineException {
protected:
    string info;
public:
    MeineException(const char *n) : info(n) {}
    virtual void print() { cout << "info?: " << info << endl; }
};

class DeineException : public MeineException {
public:
    DeineException(const char *n) : MeineException(n) {}
    void print() { cout << "info!: " << info << endl; }
};

int main() {
    try {
        throw DeineException("Psst! Geheim!");
    } catch (MeineException e) {
        e.print();
    }
    try {
        throw DeineException("Psst! Geheim!");
    } catch (MeineException &e) {
        e.print();
    }

	return 0;
}
compiler

pages/Kapitel12-page-101.svg

pages/Kapitel12-page-102.svg

pages/Kapitel12-page-103.svg

pages/Kapitel12-page-104.svg

pages/Kapitel12-page-105.svg

pages/Kapitel12-page-106.svg

pages/Kapitel12-page-107.svg

pages/Kapitel12-page-108.svg

pages/Kapitel12-page-109.svg

pages/Kapitel12-page-110.svg

pages/Kapitel12-page-111.svg

pages/Kapitel12-page-112.svg

pages/Kapitel12-page-113.svg

pages/Kapitel12-page-114.svg

pages/Kapitel12-page-115.svg

pages/Kapitel12-page-116.svg

pages/Kapitel12-page-117.svg

Live-Demo - Ausnahmen im Konstruktor

#include <iostream>

using namespace std;

struct Member{
    Member() { cout << "Member Konstruktor" << endl; }
    ~Member() { cout << "Member Destruktor" << endl; }
};

struct MyClass{
    Member member;
    
    MyClass() {
        cout << "MyClass Konstruktor" << endl;
        throw 23;
    }
    ~MyClass() { cout << "MyClass Destruktor" << endl; }
};

int main() {
    try {
        MyClass mc{};
    } catch (int i) {
        cout << "Caught Exception " << i << endl;
    }

	return 0;
}
compiler

pages/Kapitel12-page-118.svg

pages/Kapitel12-page-119.svg

pages/Kapitel12-page-120.svg

pages/Kapitel12-page-121.svg

pages/Kapitel12-page-122.svg

pages/Kapitel12-page-123.svg

pages/Kapitel12-page-124.svg

pages/Kapitel12-page-125.svg

pages/Kapitel12-page-126.svg

pages/Kapitel12-page-127.svg

pages/Kapitel12-page-128.svg

pages/Kapitel12-page-129.svg

pages/Kapitel12-page-130.svg

Wissensspeicher 19

Ausnahmebehandlung

  • Signalisierung von auftretenden Fehlern an den aufrufenden Programmcode
  • Umsetzung
    • Werfen von Ausnahmen mittels throw std::exception()
    • Fangen von Ausnahmen mittels try { } catch (std::exception e) {}
  • Unterscheidung von Fehlern anhand des Datentyps
class Error {};
class Overflow : public Error {};

try {
    throw Overflow();
} catch(Error e) {
    // Weitere Fehlerbehandlung
} catch(Overflow o) {
    // Weitere Fehlerbehandlung
}

Live-Demo - Bisheriger Stand

#include <iostream>

using namespace std;

class Error {
public:
    string info;
    Error(string _info) : info(_info) {}
};

void mehrArbeit(int a) {
    if (a == 0) {
        throw Error(":-(");
    }
}

void arbeit() {
    try {
        mehrArbeit(0);
    } catch(Error e) {
        throw "FEHLER!!!";
    }
}

int main() {
    try {
        arbeit();
    } catch (Error e) {
        cout << "Error: " << e.info << endl;
    } catch (...) {
        cout << "Unknown exception caught" << endl;
    }

	return 0;
}
compiler

pages/Kapitel12-page-131.svg

pages/Kapitel12-page-132.svg

pages/Kapitel12-page-133.svg

pages/Kapitel12-page-134.svg

pages/Kapitel12-page-135.svg

pages/Kapitel12-page-136.svg

pages/Kapitel12-page-137.svg

pages/Kapitel12-page-138.svg

pages/Kapitel12-page-139.svg

pages/Kapitel12-page-140.svg

pages/Kapitel12-page-141.svg

pages/Kapitel12-page-142.svg

pages/Kapitel12-page-143.svg

pages/Kapitel12-page-144.svg

pages/Kapitel12-page-145.svg

pages/Kapitel12-page-146.svg

pages/Kapitel12-page-147.svg

pages/Kapitel12-page-148.svg

pages/Kapitel12-page-149.svg

pages/Kapitel12-page-150.svg

pages/Kapitel12-page-151.svg

pages/Kapitel12-page-152.svg

pages/Kapitel12-page-153.svg

pages/Kapitel12-page-154.svg

pages/Kapitel12-page-155.svg

pages/Kapitel12-page-156.svg

pages/Kapitel12-page-157.svg

pages/Kapitel12-page-158.svg

pages/Kapitel12-page-159.svg

pages/Kapitel12-page-160.svg

pages/Kapitel12-page-161.svg

pages/Kapitel12-page-162.svg

pages/Kapitel12-page-163.svg

pages/Kapitel12-page-164.svg

pages/Kapitel12-page-165.svg

pages/Kapitel12-page-166.svg

pages/Kapitel12-page-167.svg

pages/Kapitel12-page-168.svg

pages/Kapitel12-page-169.svg

pages/Kapitel12-page-170.svg

pages/Kapitel12-page-171.svg

pages/Kapitel12-page-172.svg

pages/Kapitel12-page-173.svg

pages/Kapitel12-page-174.svg

pages/Kapitel12-page-175.svg

pages/Kapitel12-page-176.svg

pages/Kapitel12-page-177.svg

pages/Kapitel12-page-178.svg

pages/Kapitel12-page-179.svg

pages/Kapitel12-page-180.svg

pages/Kapitel12-page-181.svg

pages/Kapitel12-page-182.svg

pages/Kapitel12-page-183.svg

pages/Kapitel12-page-184.svg

pages/Kapitel12-page-185.svg

pages/Kapitel12-page-186.svg

pages/Kapitel12-page-187.svg

pages/Kapitel12-page-188.svg

pages/Kapitel12-page-189.svg

pages/Kapitel12-page-190.svg

pages/Kapitel12-page-191.svg

pages/Kapitel12-page-192.svg

pages/Kapitel12-page-193.svg

pages/Kapitel12-page-194.svg

pages/Kapitel12-page-195.svg

pages/Kapitel12-page-196.svg

pages/Kapitel12-page-197.svg

pages/Kapitel12-page-198.svg

pages/Kapitel12-page-199.svg

pages/Kapitel12-page-200.svg

pages/Kapitel12-page-201.svg

pages/Kapitel12-page-202.svg

pages/Kapitel12-page-203.svg

pages/Kapitel12-page-204.svg

pages/Kapitel12-page-205.svg

pages/Kapitel12-page-206.svg

pages/Kapitel12-page-207.svg

pages/Kapitel12-page-208.svg

pages/Kapitel12-page-209.svg

pages/Kapitel12-page-210.svg

pages/Kapitel12-page-211.svg

pages/Kapitel12-page-212.svg