P
Nehmen wir an du kannst absehen dass es nicht bei der arbeiterklasse bleibt sondern dass nach und nach ganz spezielle arbeiter hinzukommen. Meinetwegen management und fliessbandarbeiter. Sie alle haben einen namen und eine adresse aber unterschiedliche orte wo sie arbeiten zum beispiel.
Wenn dus so machen würdest wie jetzt müsstest du für jede art arbeiter eine eigene printmethode schreiben.
Wenn du aber sagst, dass ein manager ein arbeiter ist und ein fliessbandarbeiter ebenfalls, dann kannst du in der basisklasse arbeiter eine virtuelle methode print declarieren die gegebenenfalls von den abgeleiteten klassen überschrieben werden kann. Das ganze fällt unter das stichwort polymorphie
Mal ein beispiel
class arbeiter{
public:
arbeiter(string n,string l):name_(n),location_(l){}
virtual ~arbeiter(){}
//diese methode kann von abgeleiteten klassen überschrieben werden
virtual void print();
protected:
string name_;
string location_;
};
class manager : public arbeiter{
public:
manager(string n,string l):arbeiter(n,l){}
void print(); //ueberschreiben der methode der basisklasse
};
class fliessbandarbeiter : public arbeiter{
public:
fliessbandarbeiter(string n,string l) : arbeiter(n,l){}
void print(); //wieder überschrieben
};
//implementiereung
void arbeiter::print(){
cout<<"name: "<<name_<<endl;
cout<<"ort: "<<location_<<endl;
cout<<"arbeitsort: firma"<<endl<<endl;;
}
void manager::print(){
cout<<"name: "<<name_<<endl;
cout<<"ort: "<<location_<<endl;
cout<<"arbeitsort: buero"<<endl<<endl;
}
void fliessbandarbeiter::print(){
cout<<"name: "<<name_<<endl;
cout<<"ort: "<<location_<<endl;
cout<<"arbeitsort: fliessband"<<endl<<endl;;
}
static void print_workers(arbeiter **w,const size_t len){
for(unsigned int i=0;i<len;i++)
w[i]->print(); //jetzt wird abhängig vom genauen typ die entsprechende methode aufgerufen
}
Benutzung. Polymorphy funktioniert nur mit zeigern oder referenzen.
Nehmen wir an deine methode print bekommt ein array von zeigern auf arbeiter.
arbeiter *workers[3];
workers[0]=new arbeiter("arbeiter1","ort1");
workers[1]=new manager("arbeiter2","ort2");
workers[2]=new fliessbandarbeiter("arbeiter3","ort3");
print_workers(workers,3);
Ausgabe:
name: arbeiter1
ort: ort1
arbeitsort: firma
name: arbeiter2
ort: ort2
arbeitsort: buero
name: arbeiter3
ort: ort3
arbeitsort: fliessband