C++ klasa pochodna a prywatne pola

0

Witam mam taką klasę Samochód:

class Samochod{
	
	private: 
		string marka;
		string model;
		string kolor;
		bool silnik; // wlaczony - 1 , wylaczony - 0
		double spalanie; // w l/100km
		double paliwo; // w l
		double pojemnosc_baku; // w l
		double przebieg; //w km

	public:
		void prezentuj()
	{
		cout<<"Marka: "<<marka<<endl<<"Model: "<<model<<endl<<"Kolor: "<<kolor<<endl;
		string silniczek="Wylaczony"; //zmiana silniku z prawda/falsz na tekst
		if(silnik==1) silniczek = "Wlaczony";
		cout<<"Silnik: "<<silniczek<<endl<<"Spalanie: "<<spalanie<<endl<<"Paliwo: "<<paliwo<<endl;
		cout<<"Pojemnosc baku: "<<pojemnosc_baku<<endl<<"Przebieg: "<<przebieg<<endl;
	}
		
///////////////////////////////////////////KONSTRUKTOR I DESTRUKTOR/////////////////////////////////////////////	
		Samochod(string mar, string mod, string klr,bool sil,double spal, double prz, double pal,double poj)
		{
			marka = mar;
			model = mod;
			kolor = klr;
			silnik - sil;
			spalanie = spal;
			paliwo = pal;
			przebieg = prz;
			pojemnosc_baku = poj;
			
			cout << "Kontruktor samochod\n";
		};
		
		~Samochod(){
			cout <<"Destruktor"<<endl<<endl;
		};
				
};

I jej pochodną - Osobowy:

class Osobowy
	: public Samochod
{
	private:
		int ilosc_miejsc;
		
	Osobowy(int im, string mar, string mod, string klr,bool sil,double spal, double prz, double pal,double poj):Samochod(marka,model,kolor,silnik,spalanie,przebieg,paliwo,pojemnosc_baku), ilosc_miejsc(im)
		{
			
			marka = mar;
			model = mod;
			kolor = klr;
			silnik - sil;
			spalanie = spal;
			paliwo = pal;
			przebieg = prz;
			pojemnosc_baku = poj;

			
			cout << "Kontruktor wieloargumentowy Samochodu Osobowego \n";
		};
		


	~Osobowy(){
		cout <<"Destruktor samochodu osobowego"<<endl<<endl;
	};

	/////////////////////////////////////////////////////////////// wypisywanie samochodu osobowego /////////////////////////////////////
   void wypisz_iloscmiejsc()
   {
   		cout << "ilosc miejsc = " << ilosc_miejsc << "\n";
   };

   void wypisz()
   {
   		Samochod::prezentuj();
   		wypisz_iloscmiejsc();
   };

};

Jednak przez to że zmieniłem pola na prywatne wyskakuje błąd kompilacji - jak rozwiązać ten problem (unikając pól public)?

1

protected i wywal zawartość ciała konstruktora klasy Osobowy.

protected:
    string marka;
    string model;
    string kolor;
    bool silnik; // wlaczony - 1 , wylaczony - 0
    double spalanie; // w l/100km
    double paliwo; // w l
    double pojemnosc_baku; // w l
    double przebieg; //w km
// ...

public:
    Osobowy(int im, string mar, string mod, string klr, bool sil, double spal, double prz, double pal, double poj) 
        :Samochod(mar, mod, klr, sil, spal, prz, pal, poj), ilosc_miejsc(im)
    {} 
0

jednak zastanawia mnie czemu gdy nie zmieniłem private na protected program wydawał się działać tak samo

Ponieważ korzystasz z metody klasy Samochod, która ma dostęp do prywatnych składowych swojej klasy.
Jednak gdy zaczniesz korzystać z polimorfizmu mogą zacząć się też kłopoty.

0
YooSy napisał(a):

jednak zastanawia mnie czemu gdy nie zmieniłem private na protected program wydawał się działać tak samo

Ponieważ korzystasz z metody klasy Samochod, która ma dostęp do prywatnych składowych swojej klasy.
Jednak gdy zaczniesz korzystać z polimorfizmu mogą zacząć się też kłopoty.

Czyli na mój rozum - może zostać private w tym przypadku, jednak zaleca się protected, tak?

1

Może zostać protected. Ten poziom ochrony jest jak private poza klasą, natomiast daje dostęp klasom pochodnym.
Możesz też zostawić private, bo w tym przypadku wystarczy.

0

Dzięki wielkie

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