gpt4 book ai didi

c++ - 静态多态性中的歧义第 2 部分

转载 作者:行者123 更新时间:2023-11-28 06:04:30 35 4
gpt4 key购买 nike

关于这个answer ,为什么当通过指向派生对象的基类指针调用时,基类的非虚拟方法不会“名称隐藏”?我已经编辑了那篇文章来解释我的疑问,但没有得到回答我的人的任何回应 previous doubt .

最佳答案

这与隐藏姓名无关。在 C++ 对象模型中,一个对象包含以下内容:成员(成员变量和成员函数,后者不占用“空间”),并且,如果至少有一个成员函数被标记为 virtual,指向虚函数表的指针。每当你有类似 Base* p = new Derived; 的东西时p->f();,编译器以两种可能的方式之一进行:

  1. 如果 f 被标记为虚拟,则调用被转换为 p->vpointer[index_of_f_in_vtable]();,即 f 被调用通过指向 vtable 的指针,它具有调用 Derived::f() 的效果;
  2. 如果f 不是虚拟的,则调用Base::f(),因为指针的类型是Base

在您的例子中,没有虚拟表,因此调用了 Base::f()

参见例如this Wikipedia article以获得更详细的解释。

关于c++ - 静态多态性中的歧义第 2 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32676610/

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