frage zu virtuellen methoden



  • folgendes problem:

    class A
    {
    public:
    virtual int f2(int x);
    };
    
    class B
    {
    virtual long f2(int y);
    };
    
    void main()
    {
    D d1;
    B *bp=&d1;
    bv->f2(3);
    }
    

    welche methode wird aufgerufen, die aus A oder die aus B? eigentlich sind es ja unterschiedliche methoden aber wie soll das programm das wissen, da der rückgabewert beim aufruf ja nicht angegeben wird?
    es wäre ja nicht korrekt wenn die methode aus B jetzt die aus A überschreiben würe, da es zwei unterschiedliche methoden sind...
    klar, ich könnte explizit mit A::f2(3) oder B::f2(3) aufrufen, aber was würde in genau diesem fall passieren? welche methode wird aufgerufen??



  • Gar keine, das compiliert nicht.



  • und es hat auch nichts mir virtuellen methoden zutun...

    wo ist die ableitung?



  • @ elise, hast recht, es müsste natürlich

    class B:public A
    

    heißen ...
    ändert aber nix am problem, dass ich mich verschrieben hab...

    es muss eine lösung geben, in einer beispielaufgabe hat unser prof angegeben dass bei unterschiedlichem rückgabewert die basisklasse aufgerufen würde... ich kapier nur nicht wie das gehen soll, und das problem, dass es nicht compiliert hab ich auch schon bemerkt



  • Es kompiliert trotzdem nicht.

    Du kannst eine Funktion nicht anhand des Rückgabetypen überladen...



  • vielleicht meinst du sowas?
    zeiger der basisklasse zeigt auf ein objekt der abgeleiteten klasse..

    #include<iostream> 
    using namespace std; 
    
    class A 
    { 
    public: 
        virtual int f2(int x)=0; 
    
    }; 
    
    class B:public A 
    { 
    public:
        virtual int f2(int x) { 
            cout<<x<<endl;
            return 0;
        }
    
    }; 
    
    int main() 
    { 
        A *bp= new B; 
        bp->f2(3); 
    }
    

    edit: logik reingebracht und nicht vergessen, den destruktor auch noch virtuell zu setzen


Anmelden zum Antworten