Virtual Funktionen, Platzhalter?



  • Hallo,

    ich habe ein Headerfile mit einigen Virtual Funktionen,

    virtual void bla ( .. Platzhalter ..);

    wenn ich jetzt in beerbten Klassen Parameter übergeben will wie mache ich dass in der Oberklasse, wegen "Platzhaltern"?

    Mfg



  • guest02022009 schrieb:

    ich habe ein Headerfile mit einigen Virtual Funktionen,

    virtual void bla ( .. Platzhalter ..);

    wenn ich jetzt in beerbten Klassen Parameter übergeben will wie mache ich dass in der Oberklasse, wegen "Platzhaltern"?

    Ich verstehe deine Beschreibung nicht wirklich.

    Wenn du willst, das eine virtuelle Methode Parameter annimmt, so müssen diese in allen entsprechenden Methoden identisch sein (=> gleiche Signatur). Wenn du Defaultwerte für Parameter meinst, sollten auch diese überall identisch sein (sonst bekommst du, je nach dem über welchen Zeiger du gehst ggf. andere Vorbelegungen.

    Virtuelle Methoden sind nicht geeignet unterschiedliche Parameter anzunehmen, den wie soll damit deiner Meinung Polymorphie funktionieren?

    cu André
    P.S: Vielleicht solltest du mal ein konkretes Beispiel nennen...



  • Ich versuche es nochmal:

    Ich habe eine abstrakte Oberklasse in der ich Funktionen habe.
    Nun möchte ich diese Funktionen in verschiedenen Unterklassen implementieren.

    in der Oberklasse:
    virtual bla( + , +)

    Unterklasse1 die die Oberklasse implmentiert:
    bla( int a, int b)

    und
    Unterklasse2 die die Oberklasse implmentiert:
    bla( double a, double b)

    Meine Frage war jetzt, was ich in der Oberklasse statt "+" für Typen hinschreibe?

    Mfg



  • int a, int b



  • Wenn du noch double erlauben willst, mußt du ne zweite virtual Funktion machen:

    class Base
    {
       public:
          virtual int bla(int a, int b);
          virtual double bla(double a, double b);
    };
    


  • Aber ich glaub, du suchst eher nach templates.
    ala

    template<typename T>
    T bla(T, T);
    [...]
    double dres = bla<double>(da, db);
    int ires = bla<int>(ia, ib);
    

    Oder willst du in den bla der erbenden Klassen was ganz anderes machen in dem bla?
    Das kannst du auch.



  • guest02022009 schrieb:

    Meine Frage war jetzt, was ich in der Oberklasse statt "+" für Typen hinschreibe?

    Das ist genau das, was so nicht möglich - und auch nicht sinnvoll - ist.

    Grundsätzlich funktioniert virtual nur mit Methoden die eine identische Signatur haben. Es macht auch keinen anderen Sinn. Der Sinn von virtual ist ja gerade, das man verschiedene Objekte über eine identische Schnittstelle ansprechen kann. Vererbung mag einige, aber bei weiten nicht alle Designprobleme lösen.

    Eine Möglichkeit für dein Problem sind vielleicht die beschriebenen Templates, nur hier gilt: jede Templateinstanzierung mit einer anderen Signatur ist auch ein eigener Datentyp.

    cu André



  • Ist hier die Basisklasse überhaupt angebracht? Also kann man sagen, alle abgeleiteten Klassen sind jeweils eine Basisklasse und haben untereinander die Eigenschaften der Basisklasse gemeinsam?

    Denn wenn es dir nur darum geht, unterschiedliche Funktionen mit zwei Parametern anzubieten, sind die erwähnten Templates der bessere Weg (das ist ein völlig anderes Konzept als Objektorientierung).



  • ...
    angenommen ich habe eine Distanzfunktion die einmal die Distanz zwischen zwei Integern und beim anderen mal die Distanz zwischen zwei Strings berechnen soll.

    Jetzt möchte ich in einer ganz anderen Klasse diese Distanz berechnen abhg davon ob jetzt eben Integer oder String ist die Berechnung ja ne andere (das heisst also die Implementierung ist jedesmal eine andere), wie kann ich das jetzt relalisieren?
    ... und zwar in einer eigenen Klassenstruktur um bei Bedarf eben weitere Funktionen zu implementieren, die bspweise die Distanz zwischen "Äpfeln" berechnen

    Ich bin dankbar für jeden Vorschlag, je mehr desto besser

    Mfg



  • Liesse sich da nicht etwas mit einfacher Funktionsüberladung machen?

    Oder wie meinst du genau "in einer anderen Klasse"? Wie soll diese die Funktionen verwenden können? Ein Codebeispiel zur Verdeutlichung wäre vielleicht auch nicht schlecht...



  • Das kann man mittels Überladung machen. Anderseits wäre hier ev. auch ein template angebracht, dass einfach eine gewisse Schnittstelle erfordert, um an die benötigen Daten zu kommen und für Spezialfälle (wie den Integer z.B) gibt es ja Spezialisierung.


Anmelden zum Antworten