Virtuelle Funktion



  • Hi Leute,

    ich hab ein kleines Problem.
    Ich möchte eine Klasse ableiten, und in dieser eine Funktion ausführen, welche ich in der Basisklasse aufrufen.

    Im Header der Basisklasse ist diese so als protected deklariert:

    virtual void __fastcall setExtendedOptions(){};

    Im Header der abgeleiteten Klasse als public folgendermaßen:

    void __fastcall setExtendedOptions();

    Implementation der Funktion erfolgt dann ganz normal in der .cpp.

    Das Problem ist, das diese Funktion nach Aufruf in der Basisklasse nicht in der abgeleiteten ausgeführt wird.
    Ich bin mir aber sicher, das dies funktionieren muss, da ich es schon öfter so gemacht habe, und da gings.
    Kann es sein, daß ich irgendeine Option im Projekt ändern muss?(arbeite mit dem C++Builder 5 , deswegen die Frage auch hier)

    Vielen Dank im Voraus

    mfg

    Ron



  • Kannst Du vielleicht verraten, wo und wie Du die Funktion aufrufst.



  • Naja, wie gesagt, sie Funktion soll in der Basisklasse aufgrufen und in der abgeleiteten ausgeführt werden.

    mfg

    Ron



  • Wenn ich dich richtig verstanden habe, dann meinst Du soetwas:

    //---------------------------------------------------------------------------
    #include <iostream>
    #include <conio.h>
    #pragma hdrstop
    using namespace std;
    class A
    {
    protected:
       virtual void __fastcall func(){ cout << "hier\n"; }
    public:
       void spreche() {
          func();
       }
    };
    
    class B : public A
    {
    protected:
       virtual void __fastcall func() { cout << "und da\n"; }
    };
    //---------------------------------------------------------------------------
    
    #pragma argsused
    int main(int argc, char* argv[])
    {
       A a;  
       B b;
       A * a1 = new B;
       a.spreche();
       b.spreche();
       a1->spreche();
       delete a1;
       getch();
       return 0;
    }
    //---------------------------------------------------------------------------
    

    Bei mir funktioniert es. Ich habe auch die 5. Version. Und ich wüsste nicht, dass man dafür irgendwelche Schalter braucht.



  • So in etwa.

    Nur, das es zwei Header und zwei Cpp-Dateien sind.

    1(HeaderBasis.hpp):

    class TBasisKlasse
    {
    protected:
    virtual void __fastcall setExtendedOptions(){};
    }
    2(HeaderAbleitung.hpp)

    class TAbleitung : public TBasisKlasse
    {
    protected:
    void __fastcall setExtendedOptions();
    }

    Implementation der Funktion in der Klasse TAbleitung.

    Aufruf der Funktion in einer Statemachine in der Basisklasse:

    setExtendedOptions();

    Dies sollte eigentlich funktionieren, aber die Funktion wird NICHT in der Klasse TAbleitung ausgeführt.

    Ron



  • virtuelle Funktionen müssen auch virtual überschrieben werden...

    -junix



  • nein, das passiert automatisch. wenn die funktion in der basisklasse virtual ist, ist sie das auch in der abgeleiteten ohne es extra hinzuschreiben.



  • Lötstift schrieb:

    Aufruf der Funktion in einer Statemachine in der Basisklasse:

    setExtendedOptions();

    Dies sollte eigentlich funktionieren, aber die Funktion wird NICHT in der Klasse TAbleitung ausgeführt.

    Sollte sie aber - vorausgesetzt, Dein objekt ist tatsächlich eine Instanz der abgeleiteten und nicht der Basisklasse. (Ist das so?)

    class A
    {
    protected:
        virtual void f(){};
    public:
        void g()
        {
            f();
        }
    };
    
    class B : public A
    {
    protected:
        void f()
        {
            Application->MessageBox("B::f", "", MB_OK | MB_ICONERROR);
        }
    };
    

    Test:

    B b;
    b.g();
    


  • Grundlagendiskussion nach "C++" verschoben.



  • Rufst du die betreffende Funktion im Konstruktor der Basisklasse auf?
    Falls ja, ist es korrekt, daß Implementierung der Unterklasse nicht zum Zuge kommt.

    Stefan.


Anmelden zum Antworten