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

标签 c++ polymorphism

关于这个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/

相关文章:

c++ - 如何重载cin来读取文件

c++ - 如何理解在某些情况下允许实现将非局部变量的动态初始化视为静态初始化?

c++ - 未定义的枚举引用

java - set.contains() 和多态性?

.net - 多态性是否会干扰 NHibernate 的批量插入/更新功能?

java - 静态方法和多态性

C++ 空构造函数和成员初始化

c++ - 在 cmake 中制作宏脚本并在源文件中调用该宏

c++ - 在 QList 中添加一个 QVector

ruby-on-rails - Rails 多态模型中记录的唯一性验证