I'm trying to implement a runtime reflection module, and am having some issues with figuring out the function pointer to invoke an interface method on a class that derives from the one that implements the interface.

For example, given the following code, we can call an interface function using a delegate: http://pastie.org/8255612 - but even with the derived instance passed in it will invoke Bar's implementation as we're using Bar's object.Interface instance and thus vtable. I figured typeid(DerivedBar).interfaces would return it's own Interface instance for DerivedBar, but it returns an empty array and instead Bar's has to be used.

The ABI page doesn't seem to mention much about inheriting from a class that implements an interface and overrides it's functions. Is there a way to get the function pointer to the overridden version of foo on DerivedBar using Bar's object.Interface instance for Foo? How does the compiler know what method to call in this situation?

I'm hoping to accomplish the below without storing data for DerivedBar:
auto metadata = createMetadata!Foo;
DerivedBar instance = ... // DerivedBar is not known at compile-time.
metadata.invokeMethod("bar", instance, params);

Reply via email to