Virtuelle Methoden Pointer
-
Hi Leute ich arbeite gerade an einer reflection lib und ich bin so gut wie fertig, nur fehlt mir noch etwas: Support für Virtuelle Methoden, dazu ein kleines Beispiel:
class Base { public: virtual void Test( ) { cout << "Base::Test( )" << endl; } }; class Derived : public Base { public: virtual void Test( ) { cout << "Derived::Test( )" << endl; } }; Derived* object = new Derived( ); object->Test( ); // output: Derived::Test( ) object->Base::Test( ); // output: Base::Test( ) void (Base::*BaseMethodPtr)( ); void (Derived::*DerivedMethodPtr)( ); BaseMethodPtr = &Base::Test; DerivedMethodPtr = &Derived::Test; (object->*BaseMethodPtr)( ); // output: Derived::Test( ) (object->*DerivedMethodPtr)( ); // output: Derived::Test( )Meine Frage: Wie kann ich mit dem BaseMethodPtr auch die Base Methode aufrufen (also praktisch das "virtuelle" umgehen)?
Ich suche etwas in der Art von (object->Base::*BaseMethodPtr)( ) [was nicht kompilierbar ist].Auf Anhieb würde mir da ein Zugriff auf die virtual method table einfallen, da müsste ich dann aber wissen wie oft ich ableite und die wie vielte virtuelle Methode Test( ) ist. Die Anzahl der Ableitungen/Vererbungen kann ich noch rausbekommen, die anzahl der virtuellen Methoden jedoch eher nicht (zur not wäre es noch möglich).
-
Dein object ist vom type Base*, aber ja im Grunde ein Derived.
Du benötigst also ein object was tatsächlich vom type Base ist.
Quasi sowas:Base* object2 = reinterpret_cast<Base*>(object);Oder anders ausgedrückt die vtable von object muss entsprechend als Base initialisiert sein.
-
Das hilft mir nicht weiter!
Ich suche nach einer möglichkeit, bei einem object eine virtuelle Basis Methode aufzurufen und zwar mithilfe eines methoden pointers.Dein cast vorschlag bringt eigentlich gar nichts, da mit und ohne cast die vtable die selbe ist (da dort bereits die virtuelle methode von derived existiert).