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