Pointer-To-Pointer



  • denk mal drüber nach was diese anweisung genau bedeutet:

    A** ppA = &pB;
    

    einem zeiger auf ein A* wird die adresse eines B* zugewiesen. wie soll das funktionieren? ein B* zeigt ja nicht auf ein objekt vom typ A!?
    ein B* kann lediglich in ein A* umgewandelt werden. das bedeutet nicht, dass ein B* ein A* ist. nachdem ein B* kein A* ist, wie soll also einem A** die adresse eines B* zugewiesen werde können!?

    das ist keine frage der definition von C++, sondern es ist einfach nicht möglich/sinnvoll.

    denk dir einfach folgendes:
    nehmen wir an deine B objekte sehen im speicher so aus

    ___________
    |         |
    |    B    |
    | _______ |
    | |     | |
    | |  A  | |
    | |_____| |
    |_________|
    

    ein B* würde auf den beginn des B objektes zeigen. wandelst du den zeiger in einen A* um, dann zeigt das ergebnis auf das A in dem B. der wert des zeigers ist ein anderer. wenn du jetzt einem A** die adresse eines B* zuweisen würdest, dann würde der A** auf einen wert zeigen der nicht auf das A, sondern auf das B zeigt.


  • Mod

    PhilippMaurer schrieb:

    Einen Pointer auf einen B Pointer der auf ein B zeigt, aber vom Typ A**. Da A die Elternklasse von B ist, wären folgende "Zeigerketten" für mich logisch einwandfrei:

    A** -> A* -> A (geht in C++)
    A** -> A* -> B (geht in C++)

    A** -> B* -> B (geht nicht in C++)

    Hier liegt ein Denkfehler schon beim einfachen Zeiger vor.
    Ein B* zeigt immer nur auf ein B und ein A* immer nur auf ein A aber niemals auf ein B. Da A die Basisklasse von B ist, kann ein A* auf ein A-Objekt zeigen, dass das Basisklassensubobjekt eines B-Objektes ist - aber auch dann zeigt unser A* nur auf das A-Subobjekt.
    Wenn die Adresse eines B bekannt ist, so lässt sich damit die Adresse das A-Subobjektes in diesem B ermitteln - und C++ ist freundlich genug, das Ganze als implizite Konvertierung zuzulassen - diese Tatsache sagt aber nichts über die Pointerobjekte selbst aus. Wenn ein A** auf ein B* zeigen könnte, setzte das voraus, dass ein B*-Objekt identisch mit einem A*-Objekt ist - aber der innere Aufbau von Pointern ist (nahezu) völlig unbestimmt. Ganz nebenbei muss die Adresse eines Basisklassensubobjektes nicht mit der das vollständigen Objektes übereinstimmen - bei Mehrfachvererbung ist das offensichtlich, aber auch bei Einfachvererbung gibt es diesbezüglich keine Beschränkungen.


Anmelden zum Antworten