解释C++的Virtual函数
我:虚函数是C++实现多态的一种方式,基类的函数被声明为virtual后,派生类可以根据需要重写基类中的虚函数,实现同一调用方式实现不同效果。如果基类中的函数被声明为纯虚函数,该基类就变成一个抽象类,则派生类必须重写该纯虚函数。
书本解释:
C++在调用函数的时候,会把该调用与合适的函数定义相匹配,这种匹配发生在编译器,也称为静态绑定。
也可以告诉编译器,把函数调用与函数定义之间的匹配放到运行期去做,称为动态绑定。
如果使用了virtual,则编译器会对该函数做动态绑定。
静态绑定:
#include <iostream>
using namespace std;
class A
{
public:
void f()
{
cout<<"Base class A"<<endl;
}
};
class B :public A
{
public:
void f()
{
cout<<"Class B"<<endl;
}
};
void g(A &arg)
{
arg.f();
}
int main()
{
B x;
g(x);//g函数的参数是A类,传入的是B类
return 0;
}
执行函数g()时,虽然其参数所指的对象是B类型,但实际被调用的却是A类里的f();
因为编译器在编译期只知道g()函数的参数所引用的那个对象其类型派生自A类,但是它并不清楚这个类型究竟是A还是B。
动态绑定:
把A类中的void f()函数加上virtual声明
那么函数就会调用到B类的f();在运行期确定要调用的函数,可以明确的知道参数是B类。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!