Abfrage:Objekt von einer bestimmten Basisklasse vererbt ist?!
-
Ich probiere nun schon 2 Stunden herum aber finde keine Lösung.
Ich habe eine Basisklasse "Baseclass" und eine Subklasse "Subclass". Wenn ich nun ein Objekt "aObj" der Subklasse erstelle, werden alle Eigenschaften der Basisklasse vererbt.
Gibt es nun eine Möglichkeit abzufragen, ob das Objekt "aObj" ein Kind der Basisklasse ist?
Ich wollte es über typeid lösen, scheint allerdings nicht so richtig zu funktionieren

Weiß jemand eine Lösung wie ich in einer Abfrage herausfinden kann, ob die Klasse des Objekts aObj von der Basisklasse "Baseclass" vererbt wurde?
-
Der compiler wird dir das verraten:
#include <iostream> struct Base{ void foo(){ std::cout << "Base::foo() called" << std::endl;} }; struct Derived : Base{ void bar(){ std::cout << "Derived::bar() called" << std::endl; } }; struct Other{ int bar(){ std::cout << "Other::bar() called" << std::endl; } }; int main() { // Compiliert { Derived * d = new Derived(); Base * b = d; b->foo(); d->bar(); } //Fehler { Other * o = new Other(); Base * b = o; // Hier "»Other*« kann nicht nach »Base*« in initialization umgewandelt werden" b->foo(); o->bar(); } return 0; }
-
Danke erstmal für die schnelle Antwort.
Ich glaube, dass ich mich vielleicht nicht ganz so toll ausgedrückt habe. Mir ist durchaus klar, dass bei obigen Code der Compiler einen Fehler meldet.
Ich will diesen Vergleich jedoch in eine If-Abfrage einbauen so ca. nach diesem Schema:
Wenn Derived von Base vererbt dann ... Wenn Derived nicht von Base vererbt dann ...Ich habe es wie gesagt über typeid versucht, klappt jedoch nicht so wirklich

-
Wenn du sowas prüfen musst, dann hast du wahrscheinlich ein Designproblem. Was soll die Aufgabe seion, wo du so eine Prüfung brauchst?
-
Ich arbeite an einer SNMP-Library als Schulabschlussprojekt.
Dabei gibt es einen Datentyp namens "Sequence", was ein Vector für verschiedene Datentypen ist (in meinem Falle mit boost::ptr_vector realisiert).
Beim Setzen von Werten muss ich überprüfen ob die Elemente dieser "Sequence" alle vom Basis-Datentyp "SnmpObject" sind.
-
Und warum machst du dann diese "Sequence" nicht so, dass sie nur Objecte vom Type "SnmpObject" aufnehmen kann?
-
Hm, jetzt wo du es sagst fällt mir erst auf, dass ich meinen boost::ptr_vector eh nur für SnmpObject-Objekte bzw. Pointer darauf programmiert habe.
Danke und sry dass ich dafür extra einen neuen Thread geöffnet habe

-
Ich hab den Artikel nur schnell überflogen, aber für mich klingt das nach
dynamic_cast.for(std::vector<BaseClass*>::iterator it = vec.begin(); it != vec.end(); ++it){ BaseClass* b = (*it); if(SubClass *sub = dynamic_cast<SubClass*>(b)){ // falls dies nicht der Falls ist, liefert dynamic_cast 0 und die Bedingung ist nicht erfüllt. sub->doWhatEveryouWant(); } }btw: Der Code ist ungetestet, sollte aber so in etwa funktionieren.
EDIT: Ach von der Basisklasse... Wurschtelst du denn mit void* rum? Oder besitzt deine Basisklasse ne weitere Basisklasse?
EDIT2: Welcher Typ ist denn deinem Compiler bekannt, wenn du das Abfragen willst. Hast du sowas wie void *myObj;, oder was? Ein bisschen Code wäre hilfreichGruß,
CSpille
-
Du kannst das über SFINAE (natürlich nur zur Compilezeit)erreichen:
#include <iostream> using namespace std; struct Base{ void foo(){ std::cout << "Base::foo() called" << std::endl;} }; struct Derived : Base{ void bar(){ std::cout << "Derived::bar() called" << std::endl; } }; struct Other{ void bar(){ std::cout << "Other::bar() called" << std::endl; } }; template<typename T, typename Base> class IsDerived { private: static T* makeTPtr(); static char test(Base *); struct Dummy { char test[5]; }; static Dummy test(...); public: static bool const value = sizeof(test(makeTPtr())) == sizeof(char); }; int main() { cout << IsDerived<Derived, Base>::value << endl; cout << IsDerived<Other, Base>::value << endl; }Felix
-
CSpille schrieb:
EDIT: Ach von der Basisklasse... Wurschtelst du denn mit void* rum? Oder besitzt deine Basisklasse ne weitere Basisklasse?
Also meine Klasse "SnmpObject" ist meine Basisklasse für alle weiteren Klassen. SnmpObject hat auch keine Basisklasse mehr!
-
Dein Problem hat sich ja scheinbar um 12:06:16 erübrigt, oder?
-
Ja prinzipiell schon, weil ich unaufmerksam war.
Interessant wäre es trotzdem ob es eine Lösung für meine Frage gibt aber ist nicht mehr so wichtig
-
Du gibst der Vererbten Klasse eine Methode vom Typ void, die per referenz in eine Variable true schreibt.
Sollte sie nach dem Aufruf trotzdem False bleiben, ist die Klasse nicht vererbt worden.SO klappt es zumindest in vielen anderen Sprachen.^^