#include class Widget { public: virtual void virtualMethod1() { std::cout << "Widget::virtualMethod1() [the REAL built-in method]" << std::endl; } virtual void virtualMethod2() { std::cout << "Widget::virtualMethod2() [the REAL built-in method" << std::endl; } virtual void doSomething() { std::cout << "Widget::doSomething calling virtualMethod1()" << std::endl; virtualMethod1(); std::cout << "Widget::doSomething calling virtualMethod2()" << std::endl; virtualMethod2(); } }; class WidgetBridge: public Widget { public: void* (*virtualMethod1_Callback)(); void* (*virtualMethod2_Callback)(); void virtualMethod1() { virtualMethod1_Callback(); } void virtualMethod2() { virtualMethod2_Callback(); } }; extern "C" { Widget* new_WidgetBridge( void* (*vm1_callback)(), void* (*vm2_callback)() ) { WidgetBridge* w = new WidgetBridge(); w->virtualMethod1_Callback = vm1_callback; w->virtualMethod2_Callback = vm2_callback; return (Widget*) w; } void WidgetBridge_doSomething( Widget* instPointer ) { ((WidgetBridge*) instPointer)->doSomething(); } void Widget_virtualMethod1( Widget* instPointer ) { instPointer->Widget::virtualMethod1(); } void Widget_virtualMethod2( Widget* instPointer ) { instPointer->Widget::virtualMethod2(); } } // extern "C"