﻿

#include <iostream>
#include <string>   //to_string()  konwersja int -> string
using namespace std;

// klasa bazowa Instrument
class Instrument {
private:
    string nazwa;
    string kolor;
    int waga;
public:
    // konstruktor parametrowy z argumentami domyślnymi i listą inicjalizacyjną
    Instrument(string naz = "",  //argumentem domyślnym naz jest pusty string 
               string col = "", 
               int wag = 0): 
               nazwa(naz), 
               kolor(col), 
               waga(wag) {};
    // metoda opisujaca prywatne pola instrumentu
    string toString();
    void graj();
    
};
// klasa pochodna Gitara dziedziczy publicznie z klasy bazowej Instrument
class Gitara: public Instrument{
// prywatne pola klasy pochodnej
private:
    int liczbaStrun;
    string typ;
public:
    // publiczne metody klasy pochodnej
    // konstruktor parametrowy z argumentami domyślnymi i listą inicjalizacyjną
    Gitara(string naz = "", 
           string col = "", 
           int wag = 0, 
           int liczStr = 0, 
           string ty = ""): 
           Instrument(naz, col, wag), // wywołanie konstruktora klasy bazowej
           liczbaStrun(liczStr), 
           typ(ty){};
    void grajPalcami();
    void grajPiorkiem();
    string toString();
};
// metoda zwraca ciąg tekstowy z opisem pól instrumentu
string Instrument::toString()
{
    return "Instrument:\nnazwa: " + nazwa + ",\nkolor: " + kolor + ",\nwaga: " + to_string(waga);
}

void Instrument::graj()
{
    cout << "instrument " << nazwa << " pięknie gra" << endl;
}

void Gitara::grajPalcami()
{
    cout << "gram palcami" << endl;
}

void Gitara::grajPiorkiem()
{
    cout << "gram piórkiem" << endl;
}

// metoda wywołuje toString() klasy bazowej i dopisuje opis prywatnych pól klasy pochodnej
string Gitara::toString()
{
    return Instrument::toString() + ",\nliczba strun: " + to_string(liczbaStrun) + ",\ntyp: " + typ + "\n";
}

int main()
{
    // tworzymy obiekt klasy Gitara
    Gitara hawajska("gitara","czerwony",1,4,"hawajska");
    // opis obiektu hawajska
    cout << hawajska.toString();
    hawajska.graj();
    hawajska.grajPalcami();
    
    // tworzymy drugi obiekt klasy Gitara
    Gitara elektryczna("gitara", "czarny", 2, 6, "elektryczna");
    // opis obiektu elektryczna
    cout << elektryczna.toString();
    elektryczna.grajPiorkiem();
}

