/**
 *  \file: bacterium.h
 *
 *  Bacterium alaposztály és leszármazottjai
 */

#ifndef BACTERIUM_H
#define BACTERIUM_H

#include <string>

/// Bacterium osztály.
class Bacterium {
    std::string name;
public:
    /// @param n - baktérium neve
    Bacterium(const char *n = "") : name(n) {}

    /// show
    /// @param os - adatfolyam amire kiírja a nevét
    virtual void show(std::ostream& os) const {
        os << "Bakterium " << name;
    };
    virtual ~Bacterium() {}
};

/// Salmonella osztály.
/// Bacterium virtuális alaposztályból származik
/// a többszörös öröklési úton való elérésből adódó problémák kiküszöbölése miatt.
class Salmonella : virtual public Bacterium {
    std::string species;     // faj neve
public:
    /// @param n - salmonella fajtája
    Salmonella(const char *sp) :Bacterium("Salmonella"), species(sp) {}

    /// show
    /// @param os - adatfolyam amire kiírja a nevét és fajtáját
    void show(std::ostream& os) const {
        Bacterium::show(os);
        os << " Fajta: " << species;
    }
};

/// Streptococcus osztály.
/// Bacterium virtuális alaposztályból származik
/// a többszörös öröklési úton való elérésből adódó problémák kiküszöbölése miatt.
class  Streptococcus : virtual public Bacterium {
    char group;     // csoport neve
public:
    /// @param n - Streptococus baci csoportja
    Streptococcus(char grp) :Bacterium("Streptococcus"), group(grp) {}

    /// show
    /// @param os - adatfolyam amire kiírja a nevét és csoportját
    void show(std::ostream& os) const {
        Bacterium::show(os);
        os << " Csoport: " << group;
    }
};

/// Funktor a kiíráshoz
/// Konstruktor paraméterben megadott adatfolyamra ír
class BacteriumShow {
    std::ostream& os;
public:
    BacteriumShow(std::ostream& os = std::cout) :os(os) {}
    void operator()(Bacterium *p) {
        p->show(os);
        os << std::endl;
    }
};
#endif // BACTERIUM_H