0
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Produs{
protected:
    int pret, cantitate, id;
public:
    friend istream & operator>> (istream &is, Produs &p);
    friend ostream & operator<< (ostream &os, Produs &p);
    virtual string getTipProdus() {return "produs";};
    void setId(int _id) {
        id = _id;
    }
    virtual void print();
};
void Produs::print() {
    cout << *this;
}
istream & operator>> (istream &is, Produs &p) {
    cout << "introdu pretul produsului: " << endl;
    cin >> p.pret;
    cin.ignore();
    cout << "introdu cantitatea produsului:" << endl;
    cin >> p.cantitate;
    cin.ignore();
    return is;
}
ostream & operator<< (ostream &os, Produs &p) {
    cout << "Produsul are pretul " << p.pret << " si cantitatea " << p.cantitate << ", fiind de tipul " << p.getTipProdus() << endl;
    return os;
}
class Dvd: public Produs {
private:
    int nrminute;
public:
    string getTipProdus() override {
        return "dvd";
    }
    friend istream & operator>> (istream &is, Dvd &d);
    friend ostream & operator<< (ostream &os, Dvd &d);
    void print() override;
};
void Dvd::print() {
    cout << *this;
}
istream & operator>> (istream &is, Dvd &d) {
    is >> (Produs&)d;
    cout << "introdu durata, in minute: " << endl;
    cin >> d.nrminute;
    cin.ignore();
    return is;
}
ostream & operator<< (ostream &os, Dvd &d) {
    os << (Produs&)d;
    cout << "Acest " << d.getTipProdus() <<" are o durata de " << d.nrminute << " minute ";
    return os;
}
class MusicDvd: public Dvd {
private:
    string interpreti;
    string numeAlbum;
public:
    friend istream & operator>> (istream &is, MusicDvd &md);
    friend ostream & operator<< (ostream &os, MusicDvd &md);
    string getTipProdus() override {
        return "DVD de muzica";
    }
    void print()override;
};
void MusicDvd::print() {
    cout << "fooofff" << endl;
    cout << *this;
}
istream & operator>> (istream &is, MusicDvd &md) {
    is >> (Dvd&)md;
    cout << "specifica interpretii: " << endl;
    getline(cin, md.interpreti);
    cout << "introdu numele albumului: " << endl;
    getline(cin, md.numeAlbum);
    return is;
}
ostream & operator<< (ostream &os, MusicDvd &md) {
    os << (Dvd&)md;
    cout << ", interpretii sunt " << md.interpreti << " iar numele albumului este " << md.numeAlbum << endl;
    return os;
}
class FilmDvd: public Dvd {
private:
    string gen;
    string numeFilm;
public:
    friend istream & operator>> (istream &is, FilmDvd &fd);
    friend ostream & operator<< (ostream &os, FilmDvd &fd);
    string getTipProdus() override {
        return "DVD film";
    }
};
istream & operator>> (istream &is, FilmDvd &fd) {
    is >> (Dvd&)fd;
    cout << "specifica genul filmului: " << endl;
    getline(cin, fd.gen);
    cout << "introdu numele filmului: " << endl;
    getline(cin, fd.numeFilm);
    return is;
}
ostream & operator<< (ostream &os, FilmDvd &fd) {
    os << (Dvd&)fd;
    cout << ", genul filmului este " << fd.gen << " iar numele acestuia este " << fd.numeFilm << endl;
    return os;
}
class Carte: public Produs {
private:
    string titlu;
    string autori;
    string editura;
public:
    friend istream & operator>> (istream &is, Carte &c);
    friend ostream & operator<< (ostream &os, Carte &c);
    string getTipProdus() override {
        return "carte";
    }
};
istream & operator>> (istream &is, Carte &c) {
    is >> (Produs&)c;
    cout << "introdu titlul cartii: " << endl;
    getline(cin, c.titlu);
    cout << "introdu autorii cartii: " << endl;
    getline(cin, c.autori);
    cout << "introdu editura cartii: " << endl;
    getline(cin, c.editura);
    return is;
}
ostream & operator<< (ostream &os, Carte &c) {
    cout << "Cartea are titlul " << c.titlu << ", este scrisa de " << c.autori << " si este publicata de editura " << c.editura << endl;
    return os;
}
class ObiectColectie: public Produs {
private:
    string denumire;
public:
    friend istream & operator>> (istream &is, ObiectColectie &o);
    friend ostream & operator<< (ostream &os, ObiectColectie &o);
    string getTipProdus() override {
        return "obiect de colectie";
    }
};
istream & operator>> (istream &is, ObiectColectie &o) {
    is >> (Produs&)o;
    cout << "Introdu denumirea produsului: " << endl;
    getline(cin, o.denumire);
    return is;
}
ostream & operator<< (ostream &os, ObiectColectie &o) {
    os << (Produs&)o;
    cout << "Acest " << o.getTipProdus() << " se numeste " << o.denumire;
    return os;
}
class Figurina: public ObiectColectie {
private:
    string categorie;
    string brand;
    string material;
public:
    string getTipProdus() override {
        return "figurina";
    }
    friend istream & operator>> (istream &is, Figurina &f);
    friend ostream & operator<< (ostream &os, Figurina &f);
};
istream & operator>> (istream &is, Figurina &f) {
    is >> (ObiectColectie&)f;
    cout << "introdu categoria: " << endl;
    getline(cin, f.categorie);
    cout << "introdu brandul: " << endl;
    getline(cin, f.brand);
    cout << "introdu materialul: " << endl;
    getline(cin, f.material);
    return is;
}
ostream & operator<< (ostream &os, Figurina &f) {
    os << (ObiectColectie&)f;
    cout << ", este de categorie " << f.categorie << ", facut de brandul " << f.brand << " si din materialul " << f.material << endl;
    return os;
}
class Poster: public ObiectColectie {
private:
    string format;
public:
    string getTipProdus() override {
        return "poster";
    }
    friend istream & operator>> (istream &is, Poster &p);
    friend ostream & operator<< (ostream &os, Poster &p);
};
istream & operator>> (istream &is, Poster &p) {
    is >> (ObiectColectie&)p;
    cout << "introdu formatul: " << endl;
    getline(cin, p.format);
    return is;
}
ostream & operator<< (ostream &os, Poster &p) {
    os << (ObiectColectie&)p;
    cout << " si are formatul" << p.format << endl;
    return os;
}
class Librarie {
private:
    int numarProduse;
    vector<Produs> produse;
public:
    friend istream & operator>> (istream &is, Librarie &lib);
    friend ostream & operator<< (ostream &os, Librarie &lib);
    int getNumarProduse() {
        return numarProduse;
    }
    vector<Produs>& getProduse() {
        return produse;
    }
};
istream & operator>> (istream &is, Librarie &lib) {
    cout << "Cate produse are libraria? " << endl;
    cin >> lib.numarProduse;
    cin.ignore();
    int i;
    for (i = 1; i <= lib.numarProduse; i++) {
        cout << "introdu tipul produsului(dvd, carte sau obiect de colectie) " << endl;
        string tip;
        getline(cin, tip);
        if (tip == "dvd") {
            cout << "specifica tipul de DVD(muzica/film)" << endl;
            getline(cin, tip);
            if (tip == "muzica") {
                MusicDvd md;
                is >> md;
                md.setId(i);
                lib.produse.push_back(md);
            } else {
                if (tip == "film") {
                    FilmDvd fd;
                    is >> fd;
                    fd.setId(i);
                    lib.produse.push_back(fd);
                } else {
                    i--;
                    cout << "Eroare, input invalid. Incercati din nou." << endl;
                }
            }
        } else {
            if (tip == "obiect de colectie") {
                cout << "specifica tipul de obiect de colectie(figurina/poster)" << endl;
                getline(cin, tip);
                if (tip == "figurina") {
                    Figurina f;
                    is >> f;
                    f.setId(i);
                    lib.produse.push_back(f);
                } else {
                    if (tip == "poster") {
                        Poster p;
                        is >> p;
                        p.setId(i);
                        lib.produse.push_back(p);
                    } else {
                        i--;
                        cout << "Eroare, input invalid. Incercati din nou." << endl;
                    }
                }
            } else {
                if (tip == "carte") {
                    Carte c;
                    is >> c;
                    c.setId(i);
                    lib.produse.push_back(c);
                } else {
                    i--;
                    cout << "Eroare, input invalid. Incercati din nou." << endl;
                }
            }
        }
    }
    return is;
}
ostream & operator<< (ostream &os, Librarie &lib) {
    int i;
    for (i = 0; i < lib.numarProduse; i++) {
        os << lib.produse[i];
    }
    return os;
}

class Menu {
public:
    void ListOptions() {
        cout << "Alegeti una dintre optiuni: " << endl;
        cout << "1. afisarea tuturor produselor " << endl;
        cout << "2.editarea unui produs " << endl;
        cout << "3. ordonarea crescatoare dupa pret " << endl;
        cout << "4. cautarea unei carti dupa titlu " << endl;
        cout << "5. afisarea produselor cu cea mai mare cantitate posibila " << endl; //scrie produsului acolo dar daca e egalitate nu scrie vreo regula deci amandoua
        cout << "6. sfarsire program " << endl;
    }
    int ChooseOption(int l, int r, Librarie &lib) {
        int i = 0;
        while (i < l || i > r) {
            ListOptions();
            cout << "Alegi optiunea: " << endl;
            cin >> i;
            cin.ignore();
            if (i < l || i > r) {
                cout << "Optiune invalida, incercati din nou" << endl;
            }
        }
        return i;
    }
    void option1(Librarie &lib) {
        int n = lib.getNumarProduse();
        vector<Produs> &produse = lib.getProduse();
        int i;
        for (i = 0; i < n; i++) {
            Produs& pp = produse[i];
            string tip;
            tip = pp.getTipProdus();
            cout << tip << endl << pp.print();
        }
    }
    void MainLoop(Librarie &lib) {
        while (true) {
            int option = ChooseOption(1, 4, lib);
            if (option == 1) {
                option1(lib);
            } else if (option == 2) {
                //option2(lib);
            } else if (option == 3) {
                //option3(lib);
            } else if (option == 4) {
                //option4(lib);
            } else if (option == 5) {
                //option5(lib);
            } else {
                break;
            }
        }
        cout << '\n' << "---------------------------------" << '\n' << "Program incheiat";
    }
};
int main()
{
    Librarie lib;
    cin >> lib;
    Menu meniu;
    meniu.MainLoop(lib);

    return 0;
}

The code above basically has a menu and implements a "produs" - product class that has 3 subclasses: dvd, carte and ObiectColectie. Dvd and objectcolectie also have 2 subclasses each. I added a virtual function in Produs for writing, overridden in dvd and in dvdmuzica(dvd subclass), so if i put in an input for this it should print out the data. Given that this is not in english, an input that works is:

1
dvd
muzica
5
3
2
john
jazz

However the GetTipProdus() method does not return anything but "produs" all the time -- it should return a string equivalent to the lowest subclass this product is part of. What did i do wrong?

  • `vector` can only store instances of `Produs`, and not any other type, whether derived class or otherwise. You experience [object slicing](https://stackoverflow.com/questions/274626/what-is-object-slicing) – Igor Tandetnik May 22 '22 at 16:48
  • Please learn how to create a [mre], with emphasis on the *minimal* part. – Some programmer dude May 22 '22 at 16:49
  • 1
    As for your problem, for polymorphism you *must* use either references or pointers. This should have been explained by any [decent books](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list/388282#388282). – Some programmer dude May 22 '22 at 16:50
  • @IgorTandetnik In order to store everything i assume i need to make a different vector for each subclass? – iSuckAtAssembly May 22 '22 at 16:56
  • I suppose you could, but that'd kinda defeat the point of a common base class with virtual methods. Did you have a chance to review the section on polymorphism in your favorite C++ textbook, as @Someprogrammerdude suggested? – Igor Tandetnik May 22 '22 at 17:00

0 Answers0