oop - 为什么静态解析虚拟方法调用如此困难?

标签 oop programming-languages static-analysis virtual-functions

假设我们有以下伪代码。我说的是面向对象语言。

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();
}

编译器无法在编译时判断 aB 的实例,还是 C 的实例,还是一个普通的实例A。一般情况下,这只能在运行时决定。

编译器甚至无法知道在将来的某个时刻是否会有从 A 派生的新类与此代码链接。

关于oop - 为什么静态解析虚拟方法调用如此困难?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5702642/

相关文章:

java - 在 Java 中与基于文本的游戏中的其他对象交互

Javascript 这不指向正确的对象

java - union 与结构有何不同?其他语言有类似的结构吗?

java - 对我的 Java 项目进行 Coverity 静态分析时出现 "intermediate directory contains no translation units"错误

annotations - Java 9 的 JSR-305 注释替换

ruby-on-rails - Rails - 一项任务中的 Rake 测试和 Rubocop

php - 为什么使用动态/松散类型语言的接口(interface)?

java - 避免处理 config.properties 的 Java 类文件中的静态方法和变量

programming-languages - 编写编程语言

php - 使用脚本在一堆模板中查找函数调用