funktionszeiger: undefiniertes verhalten?
-
hallo, ich möchte hier gerade objekt-switching implementieren. ein eintrag in der tabelle soll dabei durch eine klasse dargestellt werden, die von einer FunktionsTabellenKlasse erbt. damit der compiler nicht unnötigerweise erst in der vtable nachguckt, was er jetzt aufrufen muss, wollte ich funktionszeiger verwenden wie hier:
#include <cstdio> using namespace std; struct Base { void call(int arg) { printf("Base::call()\n"); callImpl(arg); } private: virtual void callImpl(int arg) = 0; }; struct ChildA : public Base { void call(int arg) { callImpl(arg); } private: virtual void callImpl(int) { printf("child A\n"); } }; struct ChildB : public Base { void call(int arg) { callImpl(arg); } private: virtual void callImpl(int) { printf("child B\n"); } }; int main() { typedef void(Base::*memfun)(int); memfun mfA = static_cast<memfun>(&ChildA::call); memfun mfB = static_cast<memfun>(&ChildB::call); Base* a = new ChildA(); Base* b = new ChildB(); (a->*mfA)(4); (b->*mfB)(5); }das funktioniert auch, aber ist das erlaubt? wenigstens solange ich das passende objekt (klasse a - methode a, klasse b - methode b) verwende?
-
Welchen Sinn soll dein ganzes Konstrukt machen???
Entweder du willst statische Aufrufe oder aber dynamische (mittels virtual).
Warum verwendest du Funktionszeiger, du kannst doch einfach die Methoden direkt aufrufen:Base* a = new ChildA(); Base* b = new ChildB(); a->call(4); b->call(5);Auch das Überschreiben der Methode "call" in jeder abgeleiteten Klasse ergibt ja keinen Sinn, da diese ja auch nur (wie Base::call) die Methode callImpl virtuell aufrufen.
Oder hast du etwas Grundlegendes bei deinem Beispiel vergessen, um dein Anliegen vorzutragen? Was verstehst du jetzt genau unter "Object-Switching"?
-
fptr schrieb:
das funktioniert auch, aber ist das erlaubt? wenigstens solange ich das passende objekt (klasse a - methode a, klasse b - methode b) verwende?
ja, unter dieser Bedingung.
-
camper schrieb:
fptr schrieb:
das funktioniert auch, aber ist das erlaubt? wenigstens solange ich das passende objekt (klasse a - methode a, klasse b - methode b) verwende?
ja, unter dieser Bedingung.
danke.