Freigeben über


Zeiger auf Klassen

Es gibt zwei Fälle, in denen ein Zeiger auf eine Klasse in einen Zeiger auf eine Basisklasse konvertiert werden kann.

Hinweise

Der erste Fall tritt auf, wenn auf die bezeichnete Basisklasse zugegriffen werden kann und die Konvertierung eindeutig ist. (Weitere Informationen zu mehrdeutigen Basisklassen finden Sie unter Mehrere Basisklassen.)

Ob auf eine Basisklasse zugegriffen werden kann, hängt von der Art der Vererbung bei der Ableitung ab. Betrachten Sie die Vererbung, wie in der folgenden Abbildung veranschaulicht.

Vererbungsdiagramm für Abbildung der Basisklasse-Barrierefreiheit

Vererbungsdiagramm zum Basisklassenzugriff

Die folgende Tabelle zeigt die Zugriffsmöglichkeiten auf die Basisklassen bei der Situation, die in der Abbildung veranschaulicht wird.

Zugriff auf Basisklassen

Typ der Funktion

Ableitung

Konvertierung von

B* in A* zulässig?

Externe (nicht im Klassenumfang enthaltene) Funktion

Private

Nein

 

Protected

Nein

 

Public

Ja

B-Memberfunktion (im B-Bereich)

Private

Ja

 

Protected

Ja

 

Public

Ja

C-Memberfunktion (im C-Bereich)

Private

Nein

 

Protected

Ja

 

Public

Ja

Im zweiten Fall, in dem ein Zeiger auf eine Klasse in einen Zeiger auf eine Basisklasse konvertiert werden kann, wird eine explizite Typkonvertierung verwendet. (Weitere Informationen über explizite Typkonvertierungen finden Sie unter Ausdrücke mit expliziten Typkonvertierungen.)

Das Ergebnis einer solchen Konvertierung ist ein Zeiger auf das "Unterobjekt", den Teil des Objekts, der vollständig von der Basisklasse beschrieben wird.

Der folgende Code definiert zwei Klassen, A und B, wobei B von A abgeleitet ist. (Weitere Informationen über Vererbungsanforderungen finden Sie unter Abgeleitete Klassen.) Zudem definiert der Code bObject, ein Objekt vom Typ B, und zwei Zeiger (pA und pB), die auf das Objekt zeigen.

// conve__pluslang_Pointers_to_Classes.cpp
// C2039 expected
class A
{
public:
    int AComponent;
    int AMemberFunc();
};

class B : public A
{
public:
    int BComponent;
    int BMemberFunc();
};
int main()
{
   B bObject;
   A *pA = &bObject;
   B *pB = &bObject;

   pA->AMemberFunc();   // OK in class A
   pB->AMemberFunc();   // OK: inherited from class A
   pA->BMemberFunc();   // Error: not in class A
}

Der Zeiger pA ist vom Typ A *, der als "Zeiger auf ein Objekt vom Typ A" interpretiert werden kann. Member von bObject (wie BComponent und BMemberFunc) sind für den Typ B eindeutig und daher über pA nicht zugänglich. Der pA-Zeiger erlaubt nur Zugriff auf die Eigenschaften (Memberfunktionen und Daten) des Objekts, die in der Klasse A definiert sind.

Siehe auch

Referenz

Zeigerkonvertierungen (C++)