Verwirrspiel bei Ableitungen



  • Hallo zusammen, ich habe ein kleines allgemeines C++ Verständnis-Problem , aber im Forum Programmiersprachen darf ich nicht posten, also stelle ich es mal hier rein.
    Folgendes:
    Ich habe eine Basisklasse:

    class CLoader
    {
        public:
            bool Connect(long lBaudrate);
    }
    

    Nun habe ich davon Klassen abgeleitet:

    class C800 : public CLoader
    {
        public:
            void Connect();
    }
    void C800::Connect()
    {
        CLoader::Connect(115200);
    }
    
    class 425 : public CLoader
    {
        public:
            void Connect();
    }
    
    void C425::Connect()
    {
        CLoader::Connect(9600);
    }
    

    Soweit ist alles klar und funktioniert auch. Nun habe ich eine weitere Klasse, die ein Element enthält welches entweder ein C800 oder ein C425 ist.

    class CLogger
    {
        public:
            CLoader *m_pLoader;
    }
    

    Irgendwo im Code mache ich dann folgendes:

    CLogger logger;
    if (...)
    {
        logger->m_pLoader = new C425();
    } else {
        logger->m_pLoader = new C800();
    }
    

    Nun möchte ich die Connect-Funktion der abgeleiteten Klasse aufrufen, verständlicherweise wird aber mit

    logger->m_pLoader->Connect()
    

    die Connect-Funktion der Basisklasse (also CLoader) aufgerufen! Wie kann ich das ändern ? Geht das überhaupt ? (Also der Compiler meckert schon, weil ich Connect ohne Parameter aufrufe, und wenn ich sie angebe dann wird CLoader::Connect aufgerufen).

    Greets
    Thule



  • Dazu solltest Du Connect als virtuell deklarieren.



  • aber da meckert der Compiler:
    "Keine überladene Funktion akzeptiert 0 Argumente".
    Das hatte ich schon versucht, sorry dass ich vergessen habe es zu erwähnen.



  • Du musst dann natürlich Connect überall gleich deklarieren.



  • Aber das geht nicht, weil in den abgeleiteten Klassen noch Parameter bestimmt werden, die an Connect der Basisklasse übergeben werden müssen. Das Connect der Basisklasse wird ja vom Connect aller abgeleiteten Klassen aufgerufen. Gibt es nicht die Möglichkeit, über einen Typspezifierer, ähnlich dem Cast-Operator, dem Compiler zu sagen dass er eben das C800::Connect oder das C425::Conect aufrufen soll ?



  • Dann mußt du quasi 2 Funktionen anbieten, einmal die Basisfunktion mit Parameter und einmal die virtuelle (evtl. sogar abstrakt) ohne Parameter:

    class CLoader
    {
        public:
            bool DoConnect(long lBaudrate);
    
            virtual void Connect() = 0; // abstrakt, d.h. muß überschrieben werden
    };
    
    class C800 : public CLoader
    {
        public:
            /*virtual*/ void Connect(); // virtual muß nicht mehr hier angegeben werden, kannst du aber, wenn du es lieber magst
    }
    
    void C800::Connect()
    {
        CLoader::DoConnect(115200);
    }
    

    Wenn es etwas fortschrittlicher sein soll, dann kannst du dir auch mal das NVI-Idiom anschauen: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-Virtual_Interface (bzw. hier im Forum nach suchen)



  • Thule schrieb:

    Hallo zusammen, ich habe ein kleines allgemeines C++ Verständnis-Problem , aber im Forum Programmiersprachen darf ich nicht posten, also stelle ich es mal hier rein.

    Hä?

    Wieso postest Du so eine Frage nicht in der Rubrik "C++"?



  • Als ich das versuchte kam die Meldung dass da nur Moderatoren neue Beiträge schreiben dürfen, sorry.
    Dass es sich hierbei um eine C++ Frage unabhängig vom Compiler handelt ist mir auch klar....



  • Das ist natürlich ein Ansatzpunkt, TH69.
    Werde ich morgen gleich mal test ob ich es gebacken kriege:-)
    Aber erstmal 1000Dank für die Hilfe.



  • Yap, so klappts. 1000 Dank


Anmelden zum Antworten