Aufruf einer Funktion in allen existierenden Klassen eines Typs?
-
Man stelle sich folgendes Szenario vor:
Ich habe eine "Hauptklasse" ( z.B CBase ) von der ich einen ganzen Haufen anderer Klassen ableite.Jetzt sagen wir ich habe 10 von CBase abgeleitete Klassen, und ich möchte bei all diesen Klassen eine Funktion aufrufen welche in CBase definiert ist.
Gibt es eine Möglichkeit einen Funktionsaufruf in allen existierenden Klassen eines Types durchzuführen?
-
So:
Basisklasse::narf(); Basisklasse2::narf(); ...
-
bei Klassen kannst du Funktionen nur aufrufen, wenn sie static sind, ansonsten sind Funktionen nur fuer Objekte aufrufbar. Und "Alle Klasse eines Typs" ist auch keine besonders geglueckte Ausrucksweise, da jede Klasse einen eigenen Typ darstellt. Was also meinst du genau?
-
Ich glaube er meint (darauf bezog sich mein vorheriges Beispiel) darauf das wenn im "untersten" Objekt die Funktion X aufgerufen wird, diese auch für alle Klassen von der sie abgeleitet ist, aufgerufen wird.
Macht sogar Sinn:
struct A{ int a; virtual void print(){ cout << "A: " << a << endl; } }; struct B : public A{ int b; virtual void print(){ A::print(); cout << "B: " << b << endl; } }; struct C : public B{ int c; virtual void print(){ B::print(); cout << "C: " << c << endl; } };usw.
-
Ich stelle mir das so vor:
class CBase { public: void Init( void ); }; class CExtra: public CBase { public: void Init( void ); //Override der Init-Funktion von CBase };Soviel zu den beiden Klassen. Jetzt hab ich folgendes Deklariert:
CBase BaseClass1; CBase BaseClass2; CBase BaseClass3; CExtra ExtraClass1; CExtra ExtraClass2;Jetzt such ich eine Möglichkeit die ganzen Init()-Funktionen der hier deklarierten Klassen mit einem Befehl aufzurufen.
-
Wie wäre es mit dem Standardkonstruktor? Da Init keine Parameter bekommt und du anscheinend zwischen der Definition und dem Punkt des gewollten Aufrufs nichts machst, wäre das wohl ausreichend.
-
Das Init ist nur ein Beispiel.
Ich bin grad dabei eine mini-2d engine zu programmieren und will jedes Frame z.B. eine Funktion zum Position setzen ( abhängig von der Geschwindigkeit des Objektes ) aufrufen.
-
Zuerst einmal solltest du ueberpruefen, ob es wirklich eine gute Idee ist, konkrete Basisklassen zu haben (ist es meist nicht). Allgemein, wenn du fuer einen Haufen Objekte, die zu Klassen mit einem gemeinsamen Basistyp gehoeren, aehnliche FUnktionen aufrufen willst, dann laeuft das normalerweise so:
- In der Basisklasse hast du eien (rein) virtuelle Funktion deklariert
- In den abgeleiteten Klasse hast du sie definiert
- Statt einigen automatischen Objekten hast du einen Container von (smart)pointern auf die Basisklasse
- in einer Schleife dereferenzierst du fuer jedes Containerelement den jeweiligen (smart)pointer und rufst die gewuneschte methode auf.
-
Ich denke das müsste meinen Zweck erfüllen, ich muss also doch eine "Liste" mit Pointern anlegen, so wie ich mir das auch ursprünglich Gedacht habe. Mir ist in diesem Zusammenhang nur ein normales Array von Pointern eingefallen, was aber viel zu umständlich wäre. Container dagegen sind eine gute Idee. Smart-Pointer werde ich mir bei Gelegenheit mal zu Gemüte führen, muss zugeben dass ich erst mal Googlen musste...man lernt ja nie aus

-
Die Gelegenheit sollte möglichst bald sein, die Dinger können dir einige Speicherlecks udn Kopfzerbrechen sparen

hier kann man gut anfangen:
http://www.boost.org/libs/smart_ptr/smart_ptr.htm