关于这个answer ,为什么当通过指向派生对象的基类指针调用时,基类的非虚拟方法不会“名称隐藏”?我已经编辑了那篇文章来解释我的疑问,但没有得到回答我的人的任何回应 previous doubt .
最佳答案
这与隐藏姓名无关。在 C++ 对象模型中,一个对象包含以下内容:成员(成员变量和成员函数,后者不占用“空间”),并且,如果至少有一个成员函数被标记为 virtual
,指向虚函数表的指针。每当你有类似 Base* p = new Derived; 的东西时p->f();
,编译器以两种可能的方式之一进行:
- 如果
f
被标记为虚拟,则调用被转换为p->vpointer[index_of_f_in_vtable]();
,即f
被调用通过指向 vtable 的指针,它具有调用Derived::f()
的效果; - 如果
f
不是虚拟的,则调用Base::f()
,因为指针的类型是Base
。
在您的例子中,没有虚拟表,因此调用了 Base::f()
。
参见例如this Wikipedia article以获得更详细的解释。
关于c++ - 静态多态性中的歧义第 2 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32676610/