gpt4 book ai didi

c++ - 当使用对象在虚拟方法中调用虚拟方法时,应该发生虚拟分派(dispatch)吗?

转载 作者:太空宇宙 更新时间:2023-11-04 14:57:14 24 4
gpt4 key购买 nike

struct B
{
virtual void bar () {}
virtual void foo () { bar(); }
};

struct D : B
{
virtual void bar () {}
virtual void foo () {}
};

现在我们使用 B 的对象调用 foo()

B obj;
obj.foo(); // calls B::bar()

问题:bar() 应该通过 virtual 分派(dispatch)来解析,还是使用对象的静态类型(即 B)来解析。

最佳答案

编辑:我想我误解了你的问题。我很确定这取决于编译器优化器的智能程度。天真的实现当然仍然会通过虚拟查找。确定特定实现的唯一方法是编译代码并查看反汇编代码,看它是否足够智能以进行直接调用。

原答案:

它将以虚拟方式发送。当您考虑在类方法中时,这一点会更加明显,方法调用会产生类似 this->bar(); 的结果,这使得指针用于调用该方法变得显而易见,从而允许使用动态对象类型。

但是在您的示例中,由于您创建了 B,它当然会调用 B 的方法版本。

请注意(如评论中所示)即使使用隐式 this->,虚拟分派(dispatch)也不会发生在构造函数内部。

EDIT2 用于您的更新:那根本不对。 B::foo() 中的调用通常不能静态绑定(bind)(除非由于内联编译器知道对象的静态类型)。仅仅因为它知道它在 B* 上被调用并没有说明所讨论对象的真实类型 - 它可能是 D* 并且需要虚拟调度。

关于c++ - 当使用对象在虚拟方法中调用虚拟方法时,应该发生虚拟分派(dispatch)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7109566/

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