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:
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!