You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何重写Base类virtual函数foo后,Derived类仍可调用Base::foo()?

重写虚函数后仍可调用基类版本的原因

你在Derived类中重写Base的虚函数foo()后,依然能通过Base::foo()调用基类版本,核心原因如下:

  • 重写仅改变动态绑定行为,不删除基类函数:重写虚函数只是修改了C++动态多态的调用逻辑——当通过基类指针或引用调用foo()时,会根据实际对象类型匹配对应的派生类实现。但基类的foo()作为public成员,在public继承的Derived类中依然是可访问的继承成员,并没有被编译器移除或隐藏。

  • 显式作用域限定绕过动态绑定:Base::foo()这种写法是显式指定调用基类的成员函数,会跳过动态绑定的逻辑,直接执行基类的foo()实现。这是C++特意设计的特性,目的是让派生类在扩展基类功能时,能够复用基类已有的逻辑——比如你的代码中,先输出Derived的信息,再调用基类的输出,就是典型的复用场景。

  • 继承的核心是复用,访问权限不受重写影响:public继承的本质是让派生类拥有基类的public成员的访问权,重写虚函数只是多态层面的行为修改,不会改变继承带来的成员访问权限。只要基类成员的访问级别允许(这里是public),派生类就可以通过显式限定来调用。

你的代码运行后会输出:

Derived::foo()
Base::foo()

这正是因为Derived的foo()先执行自己的逻辑,再显式调用了基类的版本。

内容的提问来源于stack exchange,提问作者Gevv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:20:53