﻿
#include <iostream>
using namespace std;


// klasa abstrakcyjna wyjątek z metodą wczysto wirtualną - komunikatem
// korzystamy z poliformizmu dynamicznego
class Wyjatek{
public:
    virtual string komunikat() = 0;
};

// klasa Mianownik - wyjątek dzielenia przez zero 
class MianownikZero : public Wyjatek {
public:
    string komunikat() {
        string k = "error, mianownik nie może byc zerem";
        return k;
    }
};

// klasa Liczba - wyjątek wielkości licznika
class LicznikZlaWielkosc : public Wyjatek {
public:
    string komunikat() {
        string k = "error, licznik musi byc większy od 10";
        return k;
    }
};


int main()
{
    double a, b;
    cout << "podaj 2 liczby: licznik (większy od 10) i mianownik" << endl;
    cin >> a >> b;
    try {
        // sprawdzamy licznik i gdy jest za mały rzucamy wyjatek w postaci
        // obiektu klasy LicznikZlaWielkosc
        if (a <= 10) {
            throw LicznikZlaWielkosc();
        }
        // sprawdzamy mianownik i gdy jest zerem rzucamy wyjątek
        // w postaci obiektu klasy MianownikZero
        if (b == 0) {
            throw MianownikZero();
        }
        cout << "iloraz podanych liczb: " << a / b;
    }
    // łapiemy wyjątki w postaci referencji obiektów klasy Wyjatek
    // w ten sposob korzystamy z mechanizmu polimorfizmu dynamicznego
    catch(Wyjatek& w){
        // wypisujemy stosowny komunikat w zależnosci od obiektu błędu
        cout << w.komunikat();
    }

}


