我了解 vptr 和 vtable 的概念以及它们在实现此机制中的作用。
编译器使用至少一个虚函数为每个类构造一个 vtable 并为每个类实例添加一个 vptr 指针,以便它可以访问 vtable 并在运行时执行正确的函数,但我无法理解具体如何。
考虑以下代码:
struct A
{
virtual void foo() { cout << "A::foo" << endl; }
virtual void goo() { cout << "A::goo" << endl; }
};
struct B
{
virtual void goo() { cout << "B::goo" << endl; }
virtual void foo() { cout << "B::foo" << endl; }
};
int main()
{
A *r = (A *)(new B());
r->foo();
}
Run Code Online (Sandbox Code Playgroud)
输出:
B::goo
你能解释一下 B::goo 是如何以及为什么被执行的吗?编译器是否在编译时确定了要在 vtable 中查找的位置?谢谢。
编辑: …
我看到Calling a groovy script from a java function using javax.script我猜想使用 runWithGroovyClassLoader 可以获取一个 java 类、java 对象并使用参数调用其方法。尽管在示例中它是一个无参数的示例。
我提供了一个能够调用类型脚本的解决方案。所以我的用户在前端输入类型脚本。在后端,我们从 Java 函数中调用脚本,从 Java 向其传递当前 txn 的一些状态(参数),然后类型脚本返回一个映射/对象以调用 java 函数