Announcement

Collapse
No announcement yet.

Vererbung und Objektverwaltung durch Arrays

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Vererbung und Objektverwaltung durch Arrays

    Hallo

    Ich habe eine Frage zur Klassenverbung. Ich habe eine Reihe von Klassen die Ich von einer Klasse abgeleitet habe. Alle (verschiedenen) Objekte haben eine Methode Run(); Ich möchte jetzt ein Array anlegen in dem ich verschiedene Objekte verwalte. Da dies ja so nicht geht lege ich ein Array der Oberklasse an und instanziere aber Objekte der verschiedenen Unteklassen hinein. geht das oder schreib ich mir da meinen Speicher falsch voll.

    meine Beispiel klassen zu dem Problem ...
    <PRE>
    class TOberKlasse
    {
    public :
    TOberKlasse();
    virtual int Run();
    protected :
    int iTestVar1;
    int iTestVar2;


    };

    class TUnterKlasse1 : public TOberKlasse
    {
    public :
    TUnterKlasse1();

    int Run();

    private :
    int iTestVarUnterKlasse1;

    };

    class TUnterKlasse2 : public TOberKlasse
    {
    public :
    TUnterKlasse2();

    int Run();

    private :
    int iTestVarUnterKlasse2;

    };
    </PRE>

    meine Verwaltung

    <PRE>
    TOberKlasse* UnterKlassenArray[2];

    UnterKlassenArray[0] = new TUnterKlasse1();

    UnterKlassenArray[1] = new TUnterKlasse2();

    UnterKlassenArray[0]->Run();

    </PRE>

    wäre toll wenn sich jemand von den Profis das mal anschauen könnte.

    Danke Gruß Christian

  • #2
    Hi,

    ich weiß nicht genau, woraruf Du hinauswillst, aber wenn ich es richtig verstehe, willst Du die verschiedenen Unterklassen in einem einzigen Array speichern. <BR>
    Dann mach das Array doch void* und füge in der Oberklasse noch eine Variable ein. z.B. int SubClassType. Diesen setzt Du dann bei der Instanzierung eines Objektes im Konstruktor der Unterklassen. <BR>
    Beim Auslesen aus dem Array castest Du den void* zuerst zur Oberklasse. Somit kannst Du den Subtype auslesen und einen cast auf die richige Klasse durchführen.

    Natürlich kannst Du Dir alternativ auch mal die RTTI ansehen. Aber um das casten wirst Du nicht herumkommen.

    Grüße Joche

    Comment


    • #3
      Hi,

      genau es geht darum in EINEM Array verschiedene Objekte zu speichern.
      Die Frage war vielleicht etwas kompisch formuliert. Es funktioniert schon so wie ich oben gepostet habe. Da die Funktion Run() ja in der Oberklasse vorhanden ist brauche ich auch keinen Cast zur Unterklasse da diese Funktion automatisch ausgeführt werden. Ich war mir nur nicht sicher ob ich falsch in den Speicher schreibe wenn ich in ein Array vom Typ Oberklasse Objekte vom Typ Unterklasse speichere.
      Da es widerum nur Pointer sind bin ich mir inzwischen fast sicher dass es so stimmt. Bin nur nicht ganz sicher da ich nicht weiß wie das im speicher verwaltet wird. Sprich wo her die Speicherverwaltung weiß was für ein Objekt gerade an der Stelle OberklassenArray[X] hat. Da es sich aber bei Allen Objekten immer "nur" um die Funktion Run() handelt ist es warscheinlich egal. ODER ?

      gruß Christia

      Comment


      • #4
        Hi Christian!
        Soweit ich auf die Schnelle gesehen habe, machst du das genau richtig. Du *musst* sogar Zeiger speichern und nicht die Objekte selber, sonst erzeugst du einen Effekt namens Slicing: Du würdest dann nach Statements wie
        <pre>
        OberKlassenArray[0] = TUnterKlasse1();
        </pre>
        nur den Basisklassenanteil des Unterklassenobjekts im Array stehen haben, während das, was die Unterklasse von der Oberklasse unterscheidet, im Nirvana verschwindet.
        <p><i> Sprich wo her die Speicherverwaltung weiß was für ein Objekt gerade an der Stelle OberklassenArray[X] hat.</i><br>
        Welche Funktion "Run" aufzurufen ist, weiß nicht die Speicherverwaltung, sondern das Objekt selbst, und zwar, weil "Run" virtuell ist. (Ist es doch? :-))
        <p>HTH, Uli

        Comment


        • #5
          Hallo Ulrich,

          Danke für Deine Bestätigung. Jetzt fühl ich mich zumindest auf der sicheren Seite :-)

          Die Funktion Run() ist Virtuell

          Alla gut dann kann ich mich ja wieder voll inhaltlich an mein Projekt machen , *freu* :-)

          Gruß Christia

          Comment

          Working...
          X