Virtuelle funktionen ableiten????



  • HAbe Basisklasse A, und möchte da funkA in B und C ableiten, allerdings hat die funktion in C zusätzlich Parameter.. geht das?

    Folgendes Beispiel:

    class A {
    
     virtual void FunkA(){};
    
    };
    
    class B : public A{
     void FunkA(){.........};
    };
    
    class C: public A{
     void FunkA(Parameter){.....};
    
    };
    


  • Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • class A
    {
     virtual void FunkA(){};
     // Falls das keine Implementation in dieser Klasse hat/braucht, dann mach die Funktion rein virtuell
     //(Dann _muss_ jede abgelittene Klasse aber auch eine eigene Implementation
     //mitbringen falls sie instanziert werden soll):
     virtual void FunkA()=0;
    };
    
    class B : public A
    {
     virtual void FunkA(){/*.........*/};
    };
    
    class C: public A
    {
     // Entweder ne eigene Implementation
     virtual void FunkA(){/*...*/}
     // oder aber die aus der Basisklasse verwenden (Die wird durch FunkA
     // mit Parameter afaik sonst überdeckt)
     using void A::FunkA();
    
     void FunkA(Parameter){/*.....*/};
    };
    

    Ich versteh zwar nicht den Sinn davon, aber was solls... entweder in deinem Klassendesign stimmt was nicht oder aber du solltest die Funktion FunkA(Parameter) auch in A als (rein) virtuell deklarieren, sonst ergibt das ja nicht viel Sinn.

    Um auf deine Frage direkt zu antworten: So wie du dir das vorstellst geht das nicht.

    [edit: dieser Beitrag wurde unter den ersten Ausfallerscheinungen aufgrund von Müdigkeit verfasst]



  • BorisDieKlinge schrieb:

    ...geht das?...

    Ist die Frage, was Du unter "geht" verstehst:
    + Das ist korrekte Syntax und
    + Jedes C-Objekt hat dann auch eine Funktion void FunkA(Parameter)
    - aber leider entweder (ohne "using") statt der Funktion void FunkA(void)
    - oder (mit "using") zusätzlich zur Funktion void FunkA(void)
    - man kann natürlich keine "Basisklassen-Pointer-Polymorphie" mit "void FunkA(Parameter)" machen.

    A* a = new C;
        Parameter p;
        p->FunkA(p); // => Compilefehler: Funktion nicht definiert.
        p->FunkA();  // tut's und ruft C::FunkA() auf.
    ...
    

    => Was Du da machst, ist "overloading" und nicht "overriding".

    Gruß,

    Simon2.



  • Das dumme ist nur das er die "orginal" Funktion überdeckt. Und sowas sollte niemals bei öffentlicher Vererbung geschehen.

    grüße



  • David_pb schrieb:

    Das dumme ist nur das er die "orginal" Funktion überdeckt. Und sowas sollte niemals bei öffentlicher Vererbung geschehen.

    grüße

    Stimmt !!
    Hatte mich auf die using-Version bezogen !
    Hab's korrigiert.

    Gruß,

    Simon2.


Anmelden zum Antworten