今年的考试中,我对Java上下文中的多态性也提出了类似的问题。 Java的想法是,在编译时,类A
中的函数将被认为是合适的(考虑到编译时变量的类型),并且在运行时JVM将根据以下内容搜索覆盖的版本(在运行时类型为a
的情况下,它将从B
中找到版本(因为C
的版本实际上并未被覆盖。
我的问题是,由于C ++中没有JVM,如何根据变量的运行时类型确定函数的正确版本?我有一个模糊的想法,认为它与vtable
有关(的确如此),但我不知道它是如何工作的。
#include <iostream>
struct A
{
virtual int f(A*) { return 255; }
};
struct B : public A
{
virtual int f(A*) { return 170; }
};
struct C : public B
{
virtual int f(C*) { return 204; }
};
int main()
{
A* a = new C;
B* b = new C;
C* c = new C;
std::cout << a->f(c);
return 0;
}
输出为170。