Nicht überladen... Mit virtual???
-
Also, erstmal ein 'vereinfachtes' Beispiel...
#ifndef __Oo__ #define __Oo__ class OBj { public: int OBj_ID; public: void OBj_Menue(void); void OBj_Output(void); }; class OBj_A : public OBj { public: char* Obj_A_Name; public: void OBj_Output(void); } #endif
Und nun folgendes...
Ich will nicht alle funktionen überladen, aber wenn ich in das OBj -> OBj_Menue aufrufe, und dort drin die Funktion OBj_Output aufgerufen wird, startet immer die 'OBj_Output' Funktion der Basis klasse... auch wenn ich in einem OBj_A Objekt drin bin...Weiss einer von euch rat?
Hoffe habe es verständlich rübergebracht....
THX,
Sibob
-
Du musst die Funktion in der Basisklasse als virtual kennzeichnen. Lustigerweise erwähnst du das ja eh schon im Titel.
Man nennt das btw. nicht überladen, sondern redefinieren, wenn ne Methode virtual ist und in der abgeleiteten Klassen überschrieben wird, bzw. die Methode der Basisklasse verbergen wenn die Methode nicht virtual ist und die selbe Signatur hat wie eine in der Basisklasse.Was du hier machst, ist verbergen.
-
Ja, das habe ich ja auch versucht, nur leider ohne erfolg....
Hab momentan die Funktion überladen... das Prob. in meinen Projekt ist mom. nur, das die Klassen mehrmals überladen werden. Und somit hab ich richtigen änderung aufwand & co.
Ich hatte mir schon gedacht das es mit virtual geht, deswegen auch top., aber ...mfg
sibob
-
Mach die Methode nochmal virtual und zeig mal den Code, wo du sie aufrufst.
(Es heißt nicht überladen...)
-
#ifndef __Konto__ #define __Konto__ #include "KontoBewegung.h" class Konto { protected: int Ko_ID; long Ko_AccTransCount; char* Ko_Name; long Ko_Nummer; long Ko_Guthaben; long Ko_Zins; public: void set_Ko_ID(int); int get_Ko_ID(void); void set_Ko_AccTransCount(long); long get_Ko_AccTransCount(void); void set_Ko_Name(char*); char * get_Ko_Name(void); void set_Ko_KNr(long); long get_Ko_KNr(void); void set_Ko_Guthaben(long); long get_Ko_Guthaben(void); void set_Ko_Zins(long); long get_Ko_Zins(void); public: void Ko_SetLayout(KontoBewegung_Public**); public: void Ko_ListAccount(void); void Ko_EditAccount(void); public: void Ko_AddAssets(void); void Ko_TakeOff(void); void Ko_MoneyTransfer(KontoBewegung_Public**); public: Konto(); Konto(int, char*, long, long); ~Konto(); }; class Girokonto : public Konto { private: long KoG_UeZins; long KoG_Dispot; public: void set_KoG_UeZins(long); long get_KoG_UeZins(void); void set_KoG_Dispot(long); long get_KoG_Dispot(void); public: void Ko_ListAccount(void); void Ko_EditAccount(void); public: void Ko_AddAssets(void); void Ko_TakeOff(void); public: Girokonto(); Girokonto(int, char*, long, long, long, long, long); ~Girokonto(); }; class Sparkonto : public Konto { private: long KoS_Festgeld; public: void set_KoS_Festgeld(long); long get_KoS_Festgeld(void); public: void Ko_ListAccount(void); void Ko_EditAccount(void); public: void Ko_AddAssets(void); void Ko_TakeOff(void); public: Sparkonto(); Sparkonto(int, char*, long, long, long, long); ~Sparkonto(); }; #endif
Es geht sich um die funktion 'Ko_SetLayout'. (Hab das überladen wider rausgenommen...)
Also, ich will, wenn ich 'Ko_SetLayout' aufrufe z.b. Funktionen wie 'Ko_ListAccount' aufrufen... (sie wird überladen...)
Wenn ich sie aber aus der basisklasse aufrufe, (Obwohl ich in einen abgeleiteten objekt bin) wird auch die Funktion der Basisklasse aufgerufen....?Verständlich?
mfg
sibob
-
Dein
void Ko_ListAccount()
ist ja nicht virtual...
Mach draus
virtual void Ko_ListAccount()
, dann sollte es klappen.
-
mhhh*
OKAY, ich glaub dann hatte ich das Konzept falsch gelernt...
Ich dachte ich muss ' Ko_SetLayout' virtuel deklarieren....Jetzt funktioniert es.
Danke!mfg
sibob