C++多态与继承疑问:为何(p4->n()).m()调用A::m()而非E::m()?
问题解析:为什么调用的是A::m()而非E::m()
核心关键点在于:C++中虚函数的动态绑定仅在通过指针或引用调用时才会生效,直接调用值类型对象的成员函数会触发静态绑定。
拆解(p4->n()).m()的执行过程:
- 执行
p4->n():因为p4指向E类型对象,且E重写了n(),所以输出E::n(),这部分符合预期。 - 重点看
p4->n()的返回值:如果n()的返回类型是A(值返回),而非A&或A*,那么该语句会返回一个临时的A类型对象——即使实际是E对象,值返回时会发生对象切片,只保留E中属于基类A的部分,最终得到纯A类型的临时对象。 - 对这个临时
A对象调用m()时,由于是直接调用对象的成员函数,编译器会进行静态绑定,直接调用A::m(),不会触发虚函数的动态绑定逻辑,自然不会调用E::m()。
如果想要触发E::m()的调用,需要修改n()的返回类型为A&(返回引用)或A*(返回指针),这样通过引用/指针调用m()时,才会根据实际对象的动态类型(E)触发虚函数的动态绑定,调用E::m()。
内容的提问来源于stack exchange,提问作者lostH
相关产品推荐
相关产品推荐

