【发布时间】:2015-09-20 06:41:58
【问题描述】:
关于这个answer,为什么基类的非虚拟方法在通过指向派生对象的基类指针调用时不会“隐藏名称”?我已经编辑了该帖子以解释我的疑问,但没有得到回复我previous doubt的那个人的任何回复。
【问题讨论】:
标签: c++ polymorphism
关于这个answer,为什么基类的非虚拟方法在通过指向派生对象的基类指针调用时不会“隐藏名称”?我已经编辑了该帖子以解释我的疑问,但没有得到回复我previous doubt的那个人的任何回复。
【问题讨论】:
标签: c++ polymorphism
这与隐藏名称无关。在 C++ 对象模型中,对象包含以下内容:成员(成员变量和成员函数,后者不占用“空间”),如果至少有一个成员函数标记为 virtual,则指向表的指针的虚函数。只要你有Base* p = new Derived; p->f(); 之类的东西,编译器就会以两种可能的方式之一进行:
f被标记为virtual,则调用被转换为p->vpointer[index_of_f_in_vtable]();,即通过指向vtable的指针调用f,具有调用Derived::f()的效果; f 不是虚拟的,则调用Base::f(),因为指针的类型为Base。 在您的情况下,没有虚拟表,因此会调用 Base::f()。
参见例如this Wikipedia article获取更详细的解释。
【讨论】:
p->f(); 中,函数f 必须为Base 和Derived 所共有,并且具有完全相同的签名(直到covariance of the return type)。