问题描述
我了解 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();
}
输出:
B::goo
你能解释一下 B::goo 是如何以及为什么被执行的吗?编译器是否在编译时确定了要在 vtable 中查找的位置? 谢谢。
编辑:
上面的代码片段只是一个例子,我认为可以让您了解我不理解机制的哪一部分 - 显然,我错了 :)
请看下面的例子:
struct A
{
virtual void foo() {/* some implementation */}
virtual void goo() {/* some implementation */}
};
int main()
{
A *a = new A();
a->foo(); // <=====
}
对于这个例子,编译器构造了一个内部有两个函数指针的 vtable,一个指向 foo,另一个指向 goo。 调用 foo 时,究竟发生了什么?编译器如何知道要使用哪个指针(在 vtable 中)?希望这能说明问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)