Java(或 C++)如何处理接口中定义的方法的调用
How does Java (or C++) handles invocation of methods defined in interfaces
我目前正在研究我的编程语言,它将只有接口而没有对象继承。我有一个问题,因为我不知道如何制作一个 vtable,所以可以在继承了许多接口的 class 中调用适当的方法。
在Java中可以这样写
interface A {
void a();
}
interface B {
void b();
}
interface C {
void c();
}
class Something1 implements A, B{
... implementing a() and b() ...
}
class Something2 implements B, C{
... implementing b() and c() ...
}
...
B obj = new Something1();
obj.b();
obj = new Something2();
obj.b();
并且JVM调用b()方法时只知道对象继承了B接口(如果没有优化的话)
所以我想,首先JVM会去对象的vtable然后...它如何在vtable中找到b(),必须生成什么样的vtable。
P.S 问题根本不是 Java。它可以是 C++ 或 PHP 的示例,这无关紧要。在Java
中写一个例子就更简单了
具有多重继承的虚表通常通过虚表调度器实现。这意味着您为每个继承的接口创建一个 vtable,并根据使用的接口传递匹配的 vtable。
在您的情况下,您将为每个 class 创建两个 vtable。一种匹配B接口,一种匹配A或C接口。通过 B 接口传递 class 时。您将 class 数据指针 + 指向 B 接口 vtable 的指针传递。
我目前正在研究我的编程语言,它将只有接口而没有对象继承。我有一个问题,因为我不知道如何制作一个 vtable,所以可以在继承了许多接口的 class 中调用适当的方法。
在Java中可以这样写
interface A {
void a();
}
interface B {
void b();
}
interface C {
void c();
}
class Something1 implements A, B{
... implementing a() and b() ...
}
class Something2 implements B, C{
... implementing b() and c() ...
}
...
B obj = new Something1();
obj.b();
obj = new Something2();
obj.b();
并且JVM调用b()方法时只知道对象继承了B接口(如果没有优化的话)
所以我想,首先JVM会去对象的vtable然后...它如何在vtable中找到b(),必须生成什么样的vtable。
P.S 问题根本不是 Java。它可以是 C++ 或 PHP 的示例,这无关紧要。在Java
中写一个例子就更简单了具有多重继承的虚表通常通过虚表调度器实现。这意味着您为每个继承的接口创建一个 vtable,并根据使用的接口传递匹配的 vtable。
在您的情况下,您将为每个 class 创建两个 vtable。一种匹配B接口,一种匹配A或C接口。通过 B 接口传递 class 时。您将 class 数据指针 + 指向 B 接口 vtable 的指针传递。