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

Im ersten Fall sein, wenn die angegebene Basisklasse zugegriffen werden kann und die Konvertierung eindeutig ist.(Siehe Mehrere Basisklassen Weitere Informationen über mehrdeutige Basisklasse verweist.)

Ob eine Basisklasse zugreifen können, hängt von der Art der Vererbung verwendet in der Ableitung ab.Betrachten Sie die Vererbung als in der folgenden Abbildung veranschaulicht.

Basisklassen-Barrierefreiheit der Abbildung für Vererbungs-Diagramm

Vererbungsdiagramm zum Basisklassenzugriff

In der folgenden Tabelle sind die Basisklassen barrierefreiheit für die Situation, die in der Abbildung verdeutlicht wird.

Basisklassen-Barrierefreiheit

Typ der Funktion

Ableitung

Konvertierung von

B* gültig A* werden?

Externe (nicht Klasse-bewertete) - Funktion

Private

Nein

 

Protected

Nein

 

Public

Ja

B-Memberfunktion (in B-Bereich)

Private

Ja

 

Protected

Ja

 

Public

Ja

C-Memberfunktion (in 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, besteht darin, eine explizite Typkonvertierung verwenden.(Siehe Ausdrücke mit expliziten Typkonvertierungen Informationen zu expliziten Typkonvertierungen.)

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

Im folgenden Code werden zwei Klassen definiert, A und B, in dem B von Aabgeleitet ist.(Weitere Informationen zu Vererbung, finden Sie unter Abgeleitete Klassen). Sie definieren dann bObject, ein Objekt des Typs Bund zwei Zeiger (pA und pB) dieser Punkt auf das Objekt.

// 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 Wichtigkeit „Zeiger interpretiert werden kann, in ein Objekt des Typs A“. Member bObject (wie BComponent und BMemberFunc) sind eindeutig, B einzugeben und können daher über pAnicht zugänglich.Der pA Zeiger können den Zugriff nur auf diese Eigenschaften (Memberfunktionen und Daten) des Objekts, die in der Klasse Adefiniert sind.

Siehe auch

Referenz

Zeiger-Konvertierungen (C++)