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


Anmelden zum Antworten