Prüfen ob Klasse von einer anderen abgeleitet ist

Alles, was sonst nirgendwo reinpasst

Prüfen ob Klasse von einer anderen abgeleitet ist

Beitragvon rootnode » 13.06.08 18:41

Hat jemand eine Idee wie ich prüfen kann ob eine Klasse von einer anderen abgeleitet ist?

Also sowas z.b.:

Code: Alles auswählen
class A { ... };

class B : public A { ... };

B* p = new B();


Kann ich nun irgendwie prüfen ob B von A abgeleitet ist? Das ganze in C++ natürlich. Steh grad irgendwie aufm Schlauch.
Benutzeravatar
rootnode
 
Beiträge: 320
Registriert: 06.02.07 00:59
Wohnort: Aachen, Pontstraße

Beitragvon MartinL » 13.06.08 19:31

Wenn du das zur Compilezeit machen möchtest, so würde ich dir empfehlen mal einen Blick in die kommende Standarderweiterung tr1 zu werfen. Hier gibt es type traits templates, die ein is_base_of<A,B> modellieren können. (siehe hierzu http://www.open-std.org/jtc1/sc22/wg21/ ... /n1836.pdf section 4.6). tr1 wird in großen Teilen vom gcc unterstützt.

Wenn du eine Überprüfung zur Laufzeit haben willst, musst du dir wohl oder übel aus virtuellen Funktionen etwas selber bauen.

Gruß,

Martin
MartinL
 
Beiträge: 531
Registriert: 23.01.07 20:48
Studiert seit: WS 06/07
Anwendungsfach: Mathe

Beitragvon Coolcat » 13.06.08 19:39

Es gibt den dynamic_cast Operator.

Code: Alles auswählen
B* p = new B();

A* a = dynamic_cast<A*>(p);  // im Fehlerfall wird a = 0 gesetzt
if (!a) {
    // dat war wohl nix....
}
else {
    // alles ok
}


Ich hab das Ding bisher noch nie gebraucht, aber müsste gehen.
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon Coolcat » 13.06.08 20:07

Da mich das auch gerade interessierte.....;)

Code: Alles auswählen
#include <iostream>

class A {
   virtual void f() = 0;
};

class B : public A {
   void f() { std::cout << "B\n"; }
};

class C : public A {
   void f() { std::cout << "C\n"; }
};

int main(int argc, char **argv) {
   A* p1 = new B();
   A* p2 = new C();
   
   C* c1 = dynamic_cast<C*>(p1);
   C* c2 = dynamic_cast<C*>(p2);

   std::cout << "Test1: " << (c1 == 0) << "\n";
   std::cout << "Test2: " << (c2 == 0) << "\n";
}


Code: Alles auswählen
[coolcat@sempron2800 C++Linux]$ g++ -o dyncast dyncast.cpp
[coolcat@sempron2800 C++Linux]$ ./dyncast
Test1: 1
Test2: 0
[coolcat@sempron2800 C++Linux]$
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon rootnode » 13.06.08 22:35

Habs jetzt auch mit dynamic_casts gemacht.

Coolcat: Is zwar die falsche Richtung, aber es funktioniert dennoch.
Aber in deinem ersten Posting is die Richtung richtig. Aber afaik gibt dynamic_cast dann nicht 0 zurück sondern stirbt mit ner std::bad_typeid exception.
Benutzeravatar
rootnode
 
Beiträge: 320
Registriert: 06.02.07 00:59
Wohnort: Aachen, Pontstraße

Beitragvon C-Otto » 15.06.08 13:39

Fuer Java koennte ich dir ein Programm anbieten, das dir die Hierarchie graphisch aufbereitet :)
Dr. rer. nat. Carsten Otto
http://verify.rwth-aachen.de/otto/
Benutzeravatar
C-Otto
 
Beiträge: 568
Registriert: 10.08.06 00:20
Wohnort: Schwalbach am Taunus
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon NeX » 15.06.08 19:37

interesse :)
Don't think about....Just do it!
Benutzeravatar
NeX
 
Beiträge: 550
Registriert: 18.10.07 16:03
Wohnort: Mönchengladbach
Studiengang: Informatik (B.Sc.)
Studiert seit: WS 08/09
Anwendungsfach: BWL

Beitragvon C-Otto » 16.06.08 10:33

...wird im September veroeffentlicht :)
Dr. rer. nat. Carsten Otto
http://verify.rwth-aachen.de/otto/
Benutzeravatar
C-Otto
 
Beiträge: 568
Registriert: 10.08.06 00:20
Wohnort: Schwalbach am Taunus
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon Christopher.Schleiden » 16.06.08 12:57

Java -> UML und vice versa gibts doch schon, oder? ;)
Christopher.Schleiden
 
Beiträge: 292
Registriert: 22.10.06 14:46
Wohnort: Aachen/Bergisch Gladbach


Zurück zu Off-Topic