gpt4 book ai didi

c++ - C++动态调度机制及正确调用函数的过程

转载 作者:行者123 更新时间:2023-12-05 09:32:42 24 4
gpt4 key购买 nike

我了解 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 中)?希望这能说明问题。

最佳答案

你的例子有未定义的行为:你违反了the strict aliasing rule当试图通过 A 指针为 B 对象设置别名时。

与往常一样,对于未定义的行为,所有的赌注都落空了,对程序行为的任何进一步分析都是徒劳的。

关于c++ - C++动态调度机制及正确调用函数的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67789588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com