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
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.