abgeleitete klassen besitzen gleiche funktion



  • class A
    {
      public:
        void doIt();
    };
    
    class B
    {
      public:
        void doIt();
    };
    
    class C : public A, public B
    {
      public:
        void doAll()
        {
           A::doIt();
           B::doIt();
        }
    };
    

    So.



  • bei mir ist es genau andersherum:

    class A : public X 
    {
    protected:
       virtual void Process() PURE;
    }
    
    class B : public class A
    {
    protected:
      virtual void Process();
    
    }
    
    class C : public class A:
    {
    protected:
     virtual void Process();
    }
    


  • Scheint mir doch sehr aneinander vorbei geredet...

    Wie weiß die Basisklasse, welche der abgeleiteten Klassen aufgerufen werden muss?
    ...
    Und aus der Basisklasse möchte ich gern die richtige abgeleitete Klasse aufrufen.

    Da musst du nix machen. Sofern diese Funktion virtuell ist, wird die 'richtige' aufgerufen (die, welche dem Typ der Instanz entspricht).
    Ausser du meinst mit 'richtige' was anderes.



  • Was ist PURE?



  • Fellhuhn schrieb:

    Was ist PURE?

    Wird wohl ein '= 0' Makro sein. => Weg damit!



  • Fellhuhn schrieb:

    Was ist PURE?

    bedeutet lediglich, dass nur die abgeleiteten Klassen eine entsprechende Funktion (subclass) bereitstellen.

    Jockelx schrieb:

    Da musst du nix machen. Sofern diese Funktion virtuell ist, wird die 'richtige' aufgerufen (die, welche dem Typ der Instanz entspricht).
    Ausser du meinst mit 'richtige' was anderes.

    das Problem ist hier, dass beide abgeleiteten Klassen den gleichen Aufruf besitzen und ich diese Funktion nicht mittels eines Objects aufrufe.

    virtual void Process(CByteArray &data);
    

    und der Aufruf in der Basisklasse ist

    Process(data);
    


  • Richtig. Und in deinem Beispiel wir Process von class B bzw class C aufgerufen. Was genau willst du denn?



  • Konrad Bauer schrieb:

    und der Aufruf in der Basisklasse ist

    Process(data);
    

    Aber dieser Aufruf steht seinerseits innerhalb einer Memberfunktion; wäre Sie statisch, liesse sich das nicht kompilieren.
    Also existiert doch ein Objekt und von diesem Objekt hängt ab, welche Variante aufgerufen wird.

    Edit: Oder rufst du das im Konstruktor auf? Dann ginge das so tatsächlich nicht.



  • Fellhuhn schrieb:

    Richtig. Und in deinem Beispiel wir Process von class B bzw class C aufgerufen. Was genau willst du denn?

    nein Process() wird innerhalb von der Klasse A (Basisklasse) aufgerufen -> die jetzt ebend entscheiden muss welche abgeleitete Klasse (B oder C) ausgewählt werden soll!



  • Fellhuhn schrieb:

    Richtig. Und in deinem Beispiel wir Process von class B bzw class C aufgerufen. Was genau willst du denn?

    HÄ?!

    Welchen Typ hat das Objekt denn?
    Entweder es ist vom Typ B oder C und entsprechend wird die Funktion aufgerufen.



  • Konrad Bauer schrieb:

    Fellhuhn schrieb:

    Richtig. Und in deinem Beispiel wir Process von class B bzw class C aufgerufen. Was genau willst du denn?

    nein Process() wird innerhalb von der Klasse A (Basisklasse) aufgerufen -> die jetzt ebend entscheiden muss welche abgeleitete Klasse (B oder C) ausgewählt werden soll!

    Meinst Du vielleicht sowas?

    struct A
    {
       void doIt() {Process();}
       virtual void Process() = 0;
    };
    
    struct B : A
    {
      virtual void Process() { cout << "B\n"; }
    };
    
    struct C : A
    {
     virtual void Process() { cout << "A\n"; };
    };
    

    Wenn ja: Dann hast Du kein Problem, weil Du letztlich beim konkreten Aufruf trotzdem auf jeden Fall ein B- oder ein C-Objekt in der Hand hast (ein A-Objekt kannst Du ja nicht instantiieren, weil es abstrakt ist (=eine rein virtuelle Funktion hat)).

    int main() {
       B b;
       b.doIt();
       C c;
       c.doIt();
       return 0;
    }
    

    Vielleicht machst Du Dir das Leben ein wenig einfacher, wenn Du zwischen einer Klasse (= Strukturfestlegung) und einem Objekt (oder Instanz) (= Datensatz, der dieser Strukturfestlegung gemaäß erzeugt wurde) unterscheidest.

    BTW: Genau DAS ist der Sinn virtueller Funktionen. 😉

    Gruß,

    Simon2.


Anmelden zum Antworten