为何重写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
相关产品推荐
相关产品推荐

