Heim > Backend-Entwicklung > C++ > Wie bestimmt das Merkmal „is_base_of' Basisklassenbeziehungen, auch bei privater Vererbung?

Wie bestimmt das Merkmal „is_base_of' Basisklassenbeziehungen, auch bei privater Vererbung?

Patricia Arquette
Freigeben: 2024-11-30 21:43:12
Original
707 Leute haben es durchsucht

How Does the `is_base_of` Trait Determine Base Class Relationships, Even with Private Inheritance?

Is_Base_Of-Merkmalsimplementierung

Das is_base_of-Merkmal bietet ein Mittel, um zu bestimmen, ob eine Klasse von einer anderen abgeleitet ist, selbst wenn private oder private Klassen vorhanden sind geschütztes Erbe. Seine Implementierung basiert auf einer cleveren Verwendung von Funktionsvorlagen und benutzerdefinierten Konvertierungssequenzen.

Wie es funktioniert

Die Vorlage is_base_of benötigt zwei Vorlagenparameter, B und D, Darstellung der potenziellen Basis- bzw. abgeleiteten Klassen. Es definiert zwei statische Memberfunktionen:

  • check(D*, T): Akzeptiert einen Zeiger auf die abgeleitete Klasse und einen Vorlagenparameter T.
  • check(B*, int) : Akzeptiert einen Zeiger auf die Basisklasse und eine Ganzzahl.

Der Wert des statischen Elements von is_base_of wird dann mithilfe eines Größenvergleichs initialisiert, der im Wesentlichen prüft, ob die Größe des Ergebnisses der aufrufenden Prüfung mit einem Host Das Objekt entspricht der Größe eines „Ja“-Ergebnisses (d. h. einer Array-Größe von 1).

Private Base Inheritance

Die Implementierung ist in der Lage, private zu verarbeiten Basisvererbung, da die Host-Klasse einen No-Op-Operator B*() const bereitstellt, der nullptr zurückgibt. Dadurch kann der Compiler in der Funktion check(B*, int) ein D* für B* ersetzen, obwohl B eine private Basis von D ist.

Bedeutung des Const-Operators

Der als const deklarierte Operator B*() ist von entscheidender Bedeutung, da er sicherstellt, dass der Compiler eine Kandidatenkonvertierungsfunktion auswählt, die das implizite Objektargument this als nicht konstante Referenz verwendet. Dieser subtile Unterschied ermöglicht es dem Merkmal is_base_of, zwischen öffentlicher und privater Vererbung zu unterscheiden, indem es prüft, ob die Konvertierung in den Basistyp zulässig ist.

Vorlagenprüffunktion

Die Entscheidung dazu Die Verwendung einer Vorlagenfunktion check(D*, T) anstelle einer Nicht-Vorlagenfunktion check(B*, int) basiert auf Überlastungsauflösungsregeln. Wenn bei der Suche nach Konvertierungsfunktionen zwei Funktionen gleichermaßen realisierbar sind, entscheidet der Rückgabetyp der Funktion, welche besser ist. Durch die Verwendung einer Vorlage mit dem Rückgabetyp „Ja“ ermöglicht es dem Compiler, die richtige Version der Prüfung basierend auf dem Vorhandensein einer benutzerdefinierten Konvertierung von D* nach B* auszuwählen.

Das obige ist der detaillierte Inhalt vonWie bestimmt das Merkmal „is_base_of' Basisklassenbeziehungen, auch bei privater Vererbung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage