gpt4 book ai didi

c++ - 通过派生类实例调用base中的纯虚函数

转载 作者:行者123 更新时间:2023-11-30 03:15:16 25 4
gpt4 key购买 nike

以下代码是否需要查找 vtable 或编译器是否可以预见调用哪个函数?

class Base
{
virtual void foo() = 0;

void bar() {
this->foo(); // [*]
};
};

class A : Base
{
void foo() final {
...
};
};

Base *base = new A();
base->bar(); // sure vtable lookup at [*]!


A a;
a.bar(); // vtable lookup at [*]?

最佳答案

答案是 C++ 标准中没有任何内容要求在两个调用中的任何一个中进行动态分派(dispatch)。如果一个实现可以证明在运行时将调用什么函数,它就可以免除动态调度。例如,如果调用 bar是内联的,可以让实现知道它正在调用 foo在派生类型为 A 的对象上.在这种情况下,它不需要动态调度。

对于调用 bar 的情况未内联,this 的静态类型里面bar将是 Base* .在不了解最派生对象类型和调用上下文的情况下,在给定间接寻址的情况下,实现将需要进行动态分派(dispatch)以保证正确的行为。

如果你想知道一个实现如何处理一段具体的代码,那么你可以检查生成的程序集,或许可以使用像 https://godbolt.org 这样的工具。 .它应该一清二楚地说明正在进行何种调用。

关于c++ - 通过派生类实例调用base中的纯虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57182537/

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