Ermitteln der Vererbung während der Kompilierzeit

8

Ich kann nicht herausfinden, warum dieser Code falsch zurückgibt. Ich hatte die erste Version der Teilspezialisierung. Es hat nicht funktioniert, ich habe es mit der zweiten Version versucht. Es hat auch nicht funktioniert.

UPDATE: Ich wollte überprüfen, ob "Derived" öffentlich von "Base" abgeleitet ist.

UPDATE:

%Vor%

Ich habe das obige Code-Snippet in Strostrups Homepage gefunden. Aber es lässt den Code nicht kompilieren, wenn die abgeleitete Klasse nicht öffentlich von Base abgeleitet ist.

%Vor%     
Jagannath 25.12.2010, 02:31
quelle

5 Antworten

7

Ich benutze dafür immer nur die Pointer-Initialisierung. Zeiger konvertieren implizit nur in einen Supertyp (könnte eine Identitätskonvertierung oder eine öffentliche Basisklasse sein), so dass sie nicht kompiliert wird, es sei denn, diese Beziehung existiert (und in der richtigen Richtung).

z.B.

%Vor%

Oh, warte, du willst nicht, dass die Kompilierung fehlschlägt, sondern eine Variable setzen? Hier:

%Vor%

Hier ist eine Demo: Ссылка

    
Ben Voigt 25.12.2010, 05:58
quelle
7

Sehen Sie sich Boost-Typ-Merkmale an, insbesondere < a href="http://www.boost.org/doc/libs/1_45_0/libs/type_traits/doc/html/boost_typetraits/reference/is_base_of.html"> is_base_of Vorlage.

    
Nikolai Fetissov 25.12.2010 03:39
quelle
1

Zunächst gehe ich davon aus, dass Sie eine generische Methode für jede Klasse verwenden möchten, ohne die Klasse zu ändern oder zu ergänzen. Ich denke, dass diese Vorlagenmethode nicht funktionieren kann. Eine abgeleitete Klasse ist nicht gleich für die Basisklasse, und wenn die beiden Klassen EQUAL sind, wird die spezialisierte Struktur nicht instanziiert. Entsprechend ist der Zeiger auf die abgeleitete Klasse nicht gleich zum Zeiger auf die Basisklasse.

Ich nehme an, Sie wissen bereits, dass Benutzer regelmäßig virtuelle Funktionen verwenden, um zu überprüfen, ob das "Objekt" eine Basisklasse oder abgeleitete Klasse ist.

(Beachten Sie, dass ich nicht sage, was Sie wollen, kann nicht getan werden - nur dass die Ergebnisse, die Sie sehen, erwartet werden und der Vorlagenansatz nicht funktioniert).

    
JP19 25.12.2010 02:37
quelle
0

Überprüfen Sie, ob dies hilft ::

Vorlagentypüberprüfung C ++

    
Arunmu 25.12.2010 05:05
quelle
0

Wenn ich recht habe, rufen Sie das Template mit zwei verschiedenen Parametertypen auf.

%Vor%

Dadurch wird

aufgerufen %Vor%

und deshalb ist IsDerived<Base&, Derived&>::isDerived sowie IsDerived<const Derived*, const Base*>::isDerived falsch.

Aufrufe wie (IsDerived<Base&, Base&>::isDerived) geben True zurück.

  

Ich wollte überprüfen, ob "Abgeleitet" ist   öffentlich abgeleitet von "Base".

Ich kenne keine Template-basierte Lösung und werde diesen Thread im Auge behalten. Aber normalerweise nutze ich dynamic_cast, um diesen Job zu erledigen, wenn es jemals gebraucht wird.

Wenn dynamic_cast einen Zeiger nicht darstellen kann, weil es kein vollständiges Objekt der erforderlichen Klasse ist, gibt es einen Nullzeiger zurück, um den Fehler anzuzeigen.

Wenn dynamic_cast zur Konvertierung in einen Referenztyp verwendet wird und die Konvertierung nicht möglich ist, wird stattdessen eine Ausnahme vom Typ bad_cast ausgelöst.

    
P M 25.12.2010 05:34
quelle

Tags und Links