Jedes Objekt in .NET erbt (direkt oder indirekt) von der gemeinsamen Wurzel "Objekt". Gibt es in C ++ einen solchen allgemeinen Objektstamm? Wie gebe ich irgendein Objekt an eine Funktion weiter?
%Vor%EDIT: Um zu verdeutlichen, der Zweck: In dieser Funktion möchte ich einen Zeiger auf Member-Funktion aufrufen. Dafür brauche ich die Objektinstanz und den Zeiger auf die benötigte Funktion. Um die Lesbarkeit zu vereinfachen, möchte ich einen Wrapper mit den beiden erforderlichen Informationen erstellen. Ich bin mir nicht sicher, ob das der beste Weg ist, aber es ist die Hintergrundidee.
Es gibt keine gemeinsame Basisklasse. aber mit etwas wie boost :: any oder allgemeiner wird ein Template-basierter Ansatz gegenüber einem void * bevorzugt.
Template-Funktionen sind vorhanden und vermeiden die Notwendigkeit eines solchen Root-Parents aller Klassen.
%Vor%Wenn all Ihre Objekte eine Memberfunktion callTheFunction () haben, dann haben Sie genau das gleiche Verhalten wie eine Root-Basisklasse, mit der gleichen Bedingung (alle Klassen haben eine Funktion mit diesem Namen).
Außerdem haben Sie den zusätzlichen Vorteil, dass Sie die Template-Funktion DoSomeStuff()
für einige Klassen, die nicht Ihre sind, spezialisieren können und Ihre virtuelle Member-Funktion nicht erben können.
Dafür brauche ich die Objektinstanz und den Zeiger auf die erforderliche Funktion.
Das klingt nach "Delegierten". Zuerst müssen Sie auf jeden Fall eine gemeinsame Basisklasse für alle Objekte definieren, die Sie aufrufen möchten. In C ++ können Sie die Mehrfachvererbung verwenden, wenn das Objekt bereits zu einer anderen Hierarchie gehört.
Dann lesen Sie sich die Member-Funktionen und die schnellsten möglichen C ++ - Delegierten durch. Tiefenartikel zum Thema Delegate (bei denen es sich um einen Objekt- und einen Mitgliedsfunktionszeiger handelt, die aneinander gebunden sind). Mit der in diesem Artikel beschriebenen Headerdatei können Sie Delegaten erstellen und sie einfach wie normale Funktionszeiger aufrufen.
Es gibt keine gemeinsame Basisklasse in C ++. Es gibt jedoch bereits Bibliotheken, mit denen Sie Memberfunktionen als Delegaten aufrufen können. Sie können versuchen, boost :: function zusammen mit boost :: bind oder boost :: lambda .
Tags und Links c++ inheritance