vererbung, oder ist das polymorphie?



  • Hallo zusammen,

    ich brauch mal wieder eure hilfe. mein projekt nimmt langsam form an und es wird so langsam auch richtig komplex. jetzt brauch ich eure hilfe weil es zwar klappt aber ich es gern verstehen würde. hab mir polymorphie schon an einfachen beispielen angeschaut und denken das ist das was ich anwende aber irgendwie ist es doch anderst.

    ich habe 3 klassen

    class1 // basisklasse
    {
    public:
       int i; // nur public um klar zu machen was ich meine
    }
    
    class2 : public class1
    {
    // macht viel aber für meine frage nicht wichtig
    }
    
    class3 : public class2
    {
    public:
    int x;
    }
    

    so jetzt ist folgendes. ich erstelle in der mein ein objekt der class3

    objclass3 = new class3();
    
    // jetzt das komische
    objclass3->x; // x ist undefinierter bezeichner
    objclass3->i; // das funktioniert wunderbar...
    

    Mann muss dazu sagen das meine Klassen AFX_EXT_CLASS klassen sind.
    ich check abe rnicht wieso ich nicht darauf zugreifen kann... das muss dochen gehen. hab ich vll irgendwie ein virtual oder sowas übersehen?



  • Welchen Typ hat denn objclass3?



  • wie meinst du typ?

    AFX_EXT_CLASS class3...

    alle haben AFX_EXT_CLASS.



  • Du bist im falschen Unterforum. AFX_EXT_CLASS ist kein Standard C++. Scheint irgend eine Erweiterung von Microsoft zu sein.
    Ich nehme an ein Mod wird deinen Beitrag ins richtige Unterforum verschieben.



  • icarus2 schrieb:

    Welchen Typ hat denn objclass3?

    OMG OMG... manchmal sehe ich den wald vor lauter bäumen nicht mehr.
    icarus hat natürlich recht mit seiner frage...

    ich habe in der class1.h (basisklassenheader) den pointer mit

    class1 *objclass3;
    

    deklariert.

    sorry für eure zeit und danke für eure antworten 🙂


  • Mod

    icarus2 schrieb:

    Du bist im falschen Unterforum. AFX_EXT_CLASS ist kein Standard C++. Scheint irgend eine Erweiterung von Microsoft zu sein.
    Ich nehme an ein Mod wird deinen Beitrag ins richtige Unterforum verschieben.

    Gerne, aber was ist das für eine Sprache? 😮

    @Threadersteller: Bitte absolut korrekte Beispiele posten, nichts was du hier schnell im Editor zusammengeschreiben hast. Sonst verwirrt ein Beispiel nur. Sollten hier nicht irgendwo class -Schlüsselwörter hin? Und ein paar Semikolons? Falls nicht: Was ist das für eine Sprache?



  • Hallo,

    AFX_EXT_CLASS ist ein Makro, das bei der Erstellung von MFC Extension DLLs verwendet wird.

    classlearning schrieb:

    ich habe in der class1.h (basisklassenheader) den pointer mit

    class1 *objclass3;
    

    deklariert.

    Wenn das so ist, dann hättest du einen Zeiger auf ein class1-Objekt, damit kann man auch nur auf i der class1 zugreifen, und nicht auf das x der class3, virtual gibt es hier nicht.

    MfG,

    Probe-Nutzer



  • ok sorry, ja mach ich in zukunft, aber ich dachte ich vereinfache das beispiel ganz enorm damit man schnell weiß was ich mein.

    ich muss gerade aus 2 programmen eins machen und da kopiere ich auch einfach nur und pass die klassen bisschen an und das wäre schon sau viel code gewesen.

    mal eine andere frage, warum macht man denn sowas?
    welcher vorteil/anwendungsmöglichkeiten hat man davon?

    class1* pobj3;
    pobj3 = new class3();
    


  • Zu diesem Thema gibt es das hier:

    http://www.c-plusplus.net/forum/39457

    MfG,

    Probe-Nutzer



  • classlearning schrieb:

    mal eine andere frage, warum macht man denn sowas?
    welcher vorteil/anwendungsmöglichkeiten hat man davon?

    class1* pobj3;
    pobj3 = new class3();
    

    Gut dass du dich das fragst. Die Idee dahinter ist gut, die Ausführung ist schlecht. Die Idee ist, die Lebensdauer eines Objekts selbst bestimmen zu können. Das brauchst du, wenn du garantieren musst, dass ein Objekt über den Scope hinaus am Leben bleibt. Die Idee hat diejenige Person nun mit new umgesetzt. Das ist schlecht, da die Verwendung von new ein hohes Fehlerpotential hat. So solltest du den Code also nicht übernehmen. Wenn es gar nicht nötig ist, die Lebensdauer zu verlängern, dann erzeug das Objekt normal. Falls es doch nötig ist, nimm ein Smartpointer (unique oder shared), damit keine Fehler entstehen.



  • out schrieb:

    classlearning schrieb:

    mal eine andere frage, warum macht man denn sowas?
    welcher vorteil/anwendungsmöglichkeiten hat man davon?

    class1* pobj3;
    pobj3 = new class3();
    

    [...]
    Die Idee ist, die Lebensdauer eines Objekts selbst bestimmen zu können.
    [...]

    Es geht hier wohl eher um Polymorphie ...



  • hmm ne es geht um nen ftp zugriff...ich denke schon das es um die lebensdauer geht.

    was ist denn ein smartpointer?

    übrigens sehe ich im code nirgends das ein delete verwendet wird... also muss ich doch irgendwo speicherleaks haben?



  • bzw. in den destructoren werden die deletes teilweise benutzt, aber der destructor wird nciht explizit aufgerufen.
    werden die automatisch beim beenden aufgerufen?



  • Belli schrieb:

    out schrieb:

    classlearning schrieb:

    mal eine andere frage, warum macht man denn sowas?
    welcher vorteil/anwendungsmöglichkeiten hat man davon?

    class1* pobj3;
    pobj3 = new class3();
    

    [...]
    Die Idee ist, die Lebensdauer eines Objekts selbst bestimmen zu können.
    [...]

    Es geht hier wohl eher um Polymorphie ...

    sorry für post nr3 ich muss mich jetzt dann mal anmelden damit ich editieren kann.

    hmm warum sollte es darum gehen?
    ich mach doch polymorphie damit ein objektclass3 auf die variablen/funktionen von class2 und class1 zugreifen kann.

    aber wass des mit der laufzeit bringt check ich immer noch nicht... 🙂



  • hat wohl keiner mehr lust auf meine dummen fragen zu antworten? 🙂



  • Ich hab deine Fragen nicht ganz verstanden. Kannst du dein Anliegen konkretisieren?



  • ich mach doch polymorphie damit ein objektclass3 auf die variablen/funktionen von class2 und class1 zugreifen kann.

    Den Zugriff hast du auch bei ganz "normalen" Objekten von objektclass3 (es sei denn du erbst privat/protected oder "verschiebst" die Funktion in den nicht-oeffentlichen Bereich). Aber ich nehme mal an, du weisst noch gar nicht so recht, was Polymorphie ist ...

    Polymorphie kommt dir dann zu gute wenn du zur Kompilierzeit nicht weisst welchen abgeleiteten Typ einer Basisklasse du verwenden willst/wirst, sondern erst zur Laufzeit (beispielsweise weil es abhaengig von Benutzereingaben ist).

    Zum Beispiel:
    Du hast eine Basisklasse: Geometrie
    Und dazu einige abgeleiteten Klassen: Kreis , Rechteck , Dreieck etc., die alle von Geometrie erben.
    Jetzt nehmen wir mal an du hast eine Elementfunktion in Geometrie , die die Form z.B. auf den Bildschirm zeichnet.
    Dann kannst du einfach sowas machen:

    Geometrie *kreis = new Kreis(50);   // erstelle Kreis mit Radius 50
    kreis->Zeichne();
    

    (In diesem speziellen Fall waere es vermutlich auch sinnvoll Zeichne in Geometrie als abstrakte Funktion zu deklarieren)



  • classlearning schrieb:

    Belli schrieb:

    out schrieb:

    classlearning schrieb:

    mal eine andere frage, warum macht man denn sowas?
    welcher vorteil/anwendungsmöglichkeiten hat man davon?

    class1* pobj3;
    pobj3 = new class3();
    

    [...]
    Die Idee ist, die Lebensdauer eines Objekts selbst bestimmen zu können.
    [...]

    Es geht hier wohl eher um Polymorphie ...

    hmm warum sollte es darum gehen?

    Weil hier Zeiger auf class3 (die hoffentlich von class1 abgeleitet ist) in einem Zeiger auf ein class1-Objekt gespeichert wird.
    Außerdem geht es laut Thread - Thema um Vererbung und Polymorphie und nicht um den Sinn und Zweck von dynamischer Speicheranforderung.


Log in to reply