假设我们有以下伪代码。我说的是面向对象语言。
class A{
foo(){...}
}
class B extends A{
foo(){...}
}
class C extends B{
foo(){...}
}
static void f(A a)
{
A a=new A();
a=new B();
a.foo();
}
我们很容易认识到a.foo()正在调用B类中重写的函数foo。那么为什么编译器很难通过静态分析来得到这个事实呢?这里的基本问题是为什么静态确定 A 的类型对于编译器来说很难?
最佳答案
您发布的示例非常简单,没有显示任何需要虚拟方法调用的内容。使用相同的类,检查此函数;
void bar(A* a) {
a->foo();
}
编译器无法在编译时判断 a
是 B
的实例,还是 C
的实例,还是一个普通的实例A
。一般情况下,这只能在运行时决定。
编译器甚至无法知道在将来的某个时刻是否会有从 A
派生的新类与此代码链接。
关于oop - 为什么静态解析虚拟方法调用如此困难?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5702642/