Polymorphie

amine89

Mitglied
Hallo leute !

Vlt kann mir jmd von euch helfen !

Mein Problem ist :

ich kann nicht zugreifen auf die Methode Print() der abgeleitete klasse , sonder nur auf die Methode Print() der Basis-klasse ,

wenn ihr das Programm auch ausführt dann sieht ihr auch bei der Ausgabe , dass der Compiler nur die Print()-Methode der

Basis Klasse aufruft.

Ich bedanke mich im Voraus.

C++:
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;


class Mitarbeiter{ 

public:
	string Name;
	short GeburtsJahr;
	string Abteilung;
	short MitarbeiterID;
	
	
    Mitarbeiter(){
    	string Name ="NULL";
    	short GeburtsJahr=0;
	    string Abteilung="NULL";
	    short MitarbeiterID=0;
    }
    
    
    Mitarbeiter(string _Name,short _GeburtsJahr, string _Abteilung, short _MitarbeiterID){
    	this->Name=_Name;
        this->GeburtsJahr= _GeburtsJahr;
	    this->Abteilung=_Abteilung;
	    this->MitarbeiterID= _MitarbeiterID;}
	    
	void print(){
		cout<<"Name:"<<Name<<"\n"<<"GeburtsJahr:"<<GeburtsJahr<<"\n"<<"Abteilung:"<<Abteilung<<"\n"<<"MitarbeiterID:"<<MitarbeiterID<<"\n\n\n"<<endl;
	}    
    
	virtual double  getGehalt(){
	};
 };


class Angestellter: public Mitarbeiter{
	
	public:
		double GrundGehalt;
		int UeberStunden;
		double VerguetungUeberStunden;
		
		
    Angestellter():	Mitarbeiter(){
    	double GrundGehalt=0;
		int UeberStunden=0;
		double VerguetungUeberStunden=0;	
    }	
		
	
	Angestellter(string Name, short GebutrsJahr, string Abteilung, short MitarbeiterID,double _GrundGehalt,int _UeberStunden,double _VerguetungUeberStunden): Mitarbeiter(Name,GeburtsJahr,Abteilung,MitarbeiterID){
		this->GrundGehalt=_GrundGehalt;
		this->UeberStunden=_UeberStunden;
		this->VerguetungUeberStunden=_VerguetungUeberStunden;
	}
	
	void setGrundGehalt(double G){
		this->GrundGehalt=G;
	}
	void setUeberStunden(double U){
		this->UeberStunden=U;
	}
	void setVerguetungUeberStunden(double V){
		this->VerguetungUeberStunden=V;
	}
	
	
	double getGehalt(){
		double Gehalt = GrundGehalt+(20*UeberStunden);
		cout<<Gehalt<<"\n"<<endl;
		return Gehalt;
	}
	
	void print(){
		cout<<"Name\n"<<Name<<"GeburtsJahr\n"<<GeburtsJahr<<"Abteilung\n"<<Abteilung<<"MitarbeiterID\n"<<MitarbeiterID <<endl;
		cout<<"GrundGehalt\n"<<GrundGehalt<<"UeberStunden\n"<<UeberStunden<<"VerguetungUeberStunden\n"<<VerguetungUeberStunden<<endl;
	}
};
	
class Manager : public Mitarbeiter{
	 
	 public: 
	 double FixGehalt;
	 double Provision;
	 double Umsatz;
	 
	 
	 Manager():Mitarbeiter(){
	 	double FixGehalt=0;
	    double Provision=0;
	    double Umsatz=0;
	 }
	 
	 Manager(string Name, short GebutrsJahr, string Abteilung, short MitarbeiterID,double _FixGehalt, double _Provision, double _Umsatz): Mitarbeiter( Name,GebutrsJahr,Abteilung,MitarbeiterID){
	 	  this->FixGehalt=_FixGehalt;
	      this->Provision=_Provision;
	      this->Umsatz=_Umsatz;
	 }
	 
	void setFixGehalt(double F){
		this->FixGehalt=F;
	}
	void setProvision(double P){
		this->Provision=P;
	}
	void setUmsatz(double U){
		this->Umsatz=U;
	} 
    
	
	double getGehalt(){
		
		double Gehalt = FixGehalt+ ((Provision*Umsatz)/100);
		cout<<Gehalt<<endl;
		return Gehalt;
	}	 
	
	void print(){
		cout<<"Name:"<<Name<<"\n"<<"GeburtsJahr:"<<GeburtsJahr<<"\n"<<"Abteilung\n"<<Abteilung<<"MitarbeiterID\n"<<MitarbeiterID<<endl;
		cout<<"FixGehalt\n"<<FixGehalt<<"Provision\n"<<Provision<<"Umsatz\n"<<Umsatz<<endl;
	}
};	
	
int main(){


Mitarbeiter *refMitarbeiter;


Angestellter *refHugo;
refMitarbeiter = new Angestellter("Anna",1985,"Verkauf",123,2300.00,24.00,20.00);
refHugo = dynamic_cast<Angestellter *>(refMitarbeiter);

refMitarbeiter->print();
refMitarbeiter->getGehalt();



Manager *refAnna;
refMitarbeiter = new Manager("Hugo",1970,"IT-Manager",456,3400.00,5,18000.00);
refAnna = dynamic_cast<Manager *>(refMitarbeiter);


refMitarbeiter->print();
refMitarbeiter->getGehalt();

return 0;
}
 
Hallo

C++:
    void print(){
        cout<<"Name:"<<Name<<"\n"<<"GeburtsJahr:"<<GeburtsJahr<<"\n"<<"Abteilung:"<<Abteilung<<"\n"<<"MitarbeiterID:"<<MitarbeiterID<<"\n\n\n"<<endl;
    }

print ist nicht virtuell, daher wird immer Mitarbeiter::print aufgerufen.

Übrigens: using namespace std; im globalen Namensraum ist keine gute Idee, und anhand deines Codes vermute ich, dass du es sogar in nem Header verwendet hast, das ist noch schlimmer :O

Grüsse
Cromon
 
hallo zurück ,

du hast recht Cromon ,es hat funktioniert ! Aber ich weiss nicht warum hat der Prof das in der

Aufgabestellung nicht verlangt sowie bei der getGehalt Methode ?!!

Ich lasse es jetzt so .

Das mit using namespace std ; (ich habe es auch in einem Header Datei benutzt ) aber was ist

daran schlimm ?

Ich danke dir.
 
Das mit using namespace std ; (ich habe es auch in einem Header Datei benutzt ) aber was ist

Hallo,

schlimm wird es erst, wenn deine Projekte größer werden und/oder du deinen Quelltext weiter gibst. Stell dir vor du ein Anwender hat in seinem Projekt eine Klasse String implementiert, die er aus welchen Gründen auch immer lieber nutzt als die aus der Standard-Bibliothek. Nun nutzt er eine von dir erstellte Klasse und deine Headerdatei. Er wird zwangsläufig Probleme bekommen, weil nun zwei verschiedene String Klassen im selben Bereich vorhanden sind.

Da es auch keine Möglichkeit gibt einen Namensbereich wieder abzustellen, ist man also gezwungen diesen weiter zu nutzen oder in den fremden Headern danach zu suchen und zu löschen (was mMn unzumutbar ist ;))

Daher ist es guter Stil, auch wenn es bei einem selbst möglicherweise ohne Probleme klappt, den Namespace niemals im Header zu definieren. In dem File wo seine main-Fkt ist, ist das in der Regel kein Problem.

Grüße
 
Guten Tag Jennesta,

danke für deine Erklärung, ich habe es dank dir genau kapiert worum es geht.

lg
 
Zurück