Witam,
Jeśli mam dwie klasy z gdzie jedna dziedziczy pola z drugiej i chcę zainicjalizować za pomocą listy inicjalizacyjnej konstruktora klasy podrzędnej to mogę to jakoś zrobić w inny sposób niż wywołanie konstruktora klasy nadrzędnej w liście inicjalizacyjnej?
Prosze o pomoc, dzięki z góry
Nie wiem czy dobrze rozumiem pytanie, ale jesli masz klase lektura i jest ona pochodna klasy ksiazka i dziedziczy np skladowe takie jak okladka, strony itd publicznie, to w klasie lektura mozesz zainicjalizowac te skladowe, bo one naleza od momentu dziedziczenia do tej klasy. Konstruktor klasy pierwotnej tak czy owak tez sie uruchamia, bo lektura jest ksiazka.
Tylko jeżeli składowe są prywatne to nie ma innego sposobu niż przez odpalenie konstruktora z odpowiednimi parametrami z listy inicjalizacyjnej.
mogę chyba te pola zainicjować normalnie, ale fragment polecenia jest dokładnie taki:
Do każdej z klas dodaj konstruktor parametrowy. Osoba – konstruktor z 2 parametrami, Komputerowiec – konstruktor z 1 parametrem, Pracownik – konstruktor z 3 parametrami, NauczycielPolskiego – konstruktor z 4 parametrami, Programista i Student – konstruktor z 5 parametrami. Niech każdy z nich wypisuje na ekran, z jakiej jest klasy oraz wartości swoich parametrów. Niech również ustawia wartości pól. Dla inicjalizacji pól z klas nadrzędnych użyj listy inicjalizacyjnej.
Kod na którym mam to coś zrobić dostaliśmy od prowadzącego
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
// Klasa Ksiazka
class Ksiazka{
private:
string tytul;
public:
void settytul(string tytul){
this->tytul=tytul;
}
string gettytul(){
return tytul;
}
Ksiazka(){
cout << "Konstruktor bezparametrowy z Ksiazka" << endl;
}
~Ksiazka(){
cout << "Destruktor z Ksiazka" << endl;
}
};
// Klasa Osoba
class Osoba{
protected:
string imie;
string nazwisko;
public:
void setimie(string imie){
this->imie=imie;
}
void setnazwisko(string nazwisko){
this->nazwisko=nazwisko;
}
string getimie(){
return imie;
}
string getnazwisko(){
return nazwisko;
}
Osoba(){
cout << "Konstruktor bezparametrowy z Osoba" << endl;
}
~Osoba(){
cout << "Destruktor z Osoba" << endl;
}
};
// Klasa Pracownik
class Pracownik:public Osoba{
protected:
double zarobki;
public:
void setzarobki(double zarobki){
this->zarobki=zarobki;
}
double getzarobki(){
return zarobki;
}
Pracownik(){
cout << "Konstruktor bezparametrowy z Pracownik" << endl;
}
~Pracownik(){
cout << "Destruktor z Pracownik" << endl;
}
};
// klasa Komputerowiec
class Komputerowiec{
protected:
string ulubionesrodowisko;
public:
void setulubionesrodowisko(string ulubionesrodowisko){
this->ulubionesrodowisko=ulubionesrodowisko;
}
string getulubionesrodowisko(){
return ulubionesrodowisko;
}
Komputerowiec(){
cout << "Konstruktor bezparametrowy z Komputerowiec" << endl;
}
~Komputerowiec(){
cout << "Destruktor z Komputerowiec" << endl;
}
};
class Student:public Osoba, public Komputerowiec{
private:
int nralbumu;
Ksiazka ksiazka;
public:
void setnralbumu(int nralbumu){
this->nralbumu=nralbumu;
}
int getnralbumu(){
return nralbumu;
}
void setKsiazka(Ksiazka ksiazka){
this->ksiazka=ksiazka;
}
Ksiazka getKsiazka(){
return ksiazka;
}
Student(){
cout << "Konstruktor bezparametrowy z Student" << endl;
}
~Student(){
cout << "Destruktor z Student" << endl;
}
};
// Klasa Programista
class Programista:public Pracownik, public Komputerowiec{
private:
string ulubionyjezyk;
public:
void setulubionyjezyk(string ulubionyjezyk){
this->ulubionyjezyk=ulubionyjezyk;
}
string getulubionyjezyk(){
return ulubionyjezyk;
}
Programista(){
cout << "Konstruktor bezparametrowy z Programista" << endl;
}
~Programista(){
cout << "Destruktor z Programista" << endl;
}
};
class NauczycielPolskiego:public Pracownik{
private:
Ksiazka ksiazki[10];
public:
void setKsiazki(Ksiazka ksiazki[10]){
for(int i=0; i<10; ++i)
this->ksiazki[i]=ksiazki[i];
}
Ksiazka getUlubionaKsiazka(){
return ksiazki[0];
}
NauczycielPolskiego(){
cout << "Konstruktor bezparametrowy z NauczycielPolskiego" << endl;
}
~NauczycielPolskiego(){
cout << "Destruktor z NauczycielPolskiego" << endl;
}
};
int main(int argc, char *argv[])
{
system("PAUSE");
return 0;
}
więc nie wiem czy w klasach nadrzędnych muszę zrobić konstruktory obok tych podanych w treści zadania (bo one chyba z tego co rozumiem mają przyjmować jakieś parametry ale nie inicjować nimi pól) z parametrami które inicjują pola przyjmowanymi argumentami, czy jakoś inaczej...
To jedyny sposób, z tym że te konstruktory mogą być protected.
Ok, dzięki za odpowiedź;) Pozdrawiam