sieht es vollkommen sicher ein void(Derived::*)()
einen void(Base::*)()
, wie in diesem Code zu werfen:Warum kann ich einen Zeiger auf Abgeleitete Klassenmitgliedsfunktion nicht auf dieselbe Klasse der Klasse Base umwandeln? Für mich
#include <iostream>
#include <typeinfo>
using namespace std;
struct Base{
void(Base::*any_method)();
void call_it(){
(this->*any_method)();
}
};
struct Derived: public Base{
void a_method(){
cout<<"method!"<<endl;
}
};
int main(){
Base& a=*new Derived;
a.any_method=&Derived::a_method;
a.call_it();
}
Aber der Compiler beschwert sich über die Besetzung bei a.any_method=&Derived::a_method;
. Ist das ein Hindernis, um subtile Programmierfehler zu vermeiden, oder einfach etwas, das Compilerautoren das Leben leichter macht? Gibt es Problemumgehungen, die Klasse Base
einen Zeiger auf Elementfunktionen von Derived
ohne Typ Knoweledge (das heißt, ich kann nicht Base
eine Vorlage mit Vorlage Argument Derived
) haben.
Es ist nicht sehr klar, wie 'std :: function' hier helfen kann:' std :: function 'hat das gleiche Problem und wenn man' any_method' den Typ des Members gibt Funktion, dann hat es keinen Sinn, 'std :: function' statt eines einfachen freien Funktionszeigers zu verwenden. Recht? –
@Lorenzo: Nr. 'Std :: Funktion'. Die Funktion kann ihren eigenen "This" -Zeiger speichern. Außerdem gibt es immer einen Punkt auf "std :: function" über einen Funktionszeiger - stateful lambdas, zum Beispiel das Ergebnis von "std :: bind". Ich habe meine Antwort bearbeitet, um deutlicher zu machen, wie 'std :: function' das Problem sofort löst. –
Puppy