C++多层继承多态疑问:子类未声明virtual为何调用孙类f()?
问题解答
这是因为C++中虚函数的特性具有继承性:一旦某个基类的函数被声明为virtual,那么所有派生类中重写的同签名(同名、同参数列表、同const属性)函数,都会自动成为虚函数,无需在派生类中显式添加virtual关键字。
具体到你的代码场景:
- 基类
parent的f()被声明为虚函数,这就为该函数开启了动态多态的特性。 - 派生类
child重写f()时,即便没有写virtual,编译器会默认它继承了基类的虚属性,本质上还是虚函数。 - 进一步派生的
grandchild类重写f(),同样继承了这个虚属性。
当你使用parent*类型的指针指向grandchild对象时,调用f()会触发动态绑定:程序会在运行时根据指针实际指向的对象类型(而非指针本身的类型),调用对应类的f()函数,因此最终执行的是grandchild::f()。
内容的提问来源于stack exchange,提问作者yingma
相关产品推荐
相关产品推荐

