Polimorfizm, wypisanie metody z klasy bazowej

0
#include <iostream>
#include <string>
using namespace std;

class owoc
{
protected:
    string rodzaj;
    string kraj;
    int cena;
public:
    owoc();
    owoc(string a, string b, int c);
    owoc(owoc &mk);

    void setrodzaj(string a);
    void setkraj(string a);
    void setcena(int a);
    string getrodzaj();
    string getkraj();
    int getcena();

    virtual void wypisz() = 0;
    owoc *next;
};
owoc::owoc()
:rodzaj("cytrus"), kraj("Polska"), cena(1){}
owoc::owoc(string a, string b, int c){
    rodzaj = a;
    kraj = b;
    cena = c;
}
owoc::owoc(owoc &mk){
    rodzaj = mk.rodzaj;
    kraj = mk.kraj;
    cena = mk.cena;
}
void owoc::setrodzaj(string a){ rodzaj = a; }
void owoc::setkraj(string a){ kraj = a; }
void owoc::setcena(int a){ cena = a; }
string owoc::getrodzaj(){ return rodzaj; }
string owoc::getkraj(){ return kraj; }
int owoc::getcena(){ return cena; }
void owoc::wypisz(){
    cout << "[owoc]   rodzaj: " << rodzaj << "   kraj: " << kraj << "   cena: " << cena <<endl;
}

class truskawka
    :public owoc
{
private:
    string smak;
    string kolor;
    double waga;
public:
    truskawka();
    truskawka(string a, string b, double c, string d, string e, int f);
    truskawka(truskawka &mk);

    void setsmak(string a);
    void setkolor(string a);
    void setwaga(double a);
    string getsmak();
    string getkolor();
    double getwaga();

    void wypisz();
};
truskawka::truskawka()
:smak("slodka"), kolor("czerwona"), waga(1){}
truskawka::truskawka(string a, string b, double c, string d, string e, int f){
    rodzaj = d;
    kraj = e;
    cena = f;
    smak = a;
    kolor = b;
    waga = c;
}
truskawka::truskawka(truskawka &mk){
    smak = mk.smak;
    kolor = mk.kolor;
    waga = mk.waga;
}
void truskawka::setsmak(string a){ smak = a; }
void truskawka::setkolor(string a){ kolor = a; }
void truskawka::setwaga(double a){  waga = a; }
string truskawka::getsmak(){ return smak; }
string truskawka::getkolor(){ return kolor; }
double truskawka::getwaga(){ return waga; }
void truskawka::wypisz(){
    cout << "\n[owoc-truskawka]   smak: " << smak << "   kolor: " << kolor << "   waga: " << waga <<endl;
}

int main()
{
    owoc *head = NULL, *wsk = NULL, *owoc = NULL;
    truskawka ab;
    string r_rodzaj, k_kraj, s_smak, k_kolor;
    double c_cena = 0, w_waga = 0;
    int x = 0;

    cout << "Wybierz jaki owoc chcesz zmagazynowac.\n0 - zakoncz\n1 - truskawka\n";
    cin >> x;
    while (x >= 0 || x <= 1){
        if (x == 0){
            cout << "\nZakonczyles dodawanie elementow.\n";
            break;
        }
        if (x == 1){
            cout << "\nWybrales owoc: truskawka.\n";
            cout << "Podaj rodzaj [np. cytrus]: ";
            cin >> r_rodzaj;
            cout << "Podaj kraj pochodzenia: ";
            cin >> k_kraj;
            cout << "Podaj cene [1/kg]: ";
            cin >> c_cena;
            cout << "Podaj smak: ";
            cin >> s_smak;
            cout << "Podaj kolor: ";
            cin >> k_kolor;
            cout << "Podaj wage: ";
            cin >> w_waga;

            owoc = new truskawka(s_smak, k_kolor, w_waga, r_rodzaj, k_kraj, c_cena);
        }
        if(head == NULL){
            head = wsk = owoc;
            wsk->next = NULL;
        }
        else{
            wsk->next = owoc;
            wsk = wsk->next;
            wsk->next = NULL;
        }
        cout << "\nWybierz jaki owoc chcesz zmagazynowac.\n0 - zakoncz\n1 - truskawka\n";
        cin >> x;
    }
    //wypisz liste
    wsk = head;
    while(wsk){
        wsk->wypisz();
        wsk = wsk->next;
    }

    return 0;
}

W jaki sposób skonstruować listę dynamiczną, tak aby wyświetliła metodę wypisz() z klasy owoc, a następnie metodę wypisz() z klasy truskawka?

2

coś strasznie przekombinowujesz. Na dodatek nie wiadomo o co dokładnie ci chodzi.
Może o to?:

void truskawka::wypisz(){
    cout << "[owoc-truskawka]   "; 
    owoc::wypisz();
    cout << "smak: " << smak << "   kolor: " << kolor << "   waga: " << waga << endl;
}

To by było zrozumiałe.

Jest jeszcze taka możliwość:

wsk->owoc::wypisz();

Ale to jest bardzo złe rozwiązanie.

0

MarekR22, dziękuję za wskazówkę, o to mi chodziło. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0