c++什么是虚函数 (virtual function)_c++多态与虚函数原理说明


虚函数通过virtual关键字实现多态,允许派生类重写函数,调用时根据对象实际类型确定执行版本。1. 基类声明virtual函数,派生类可override;2. 通过基类指针或引用调用时,程序依据对象类型而非指针类型选择函数;3. C++底层通过vtable和vptr实现动态绑定,每个含虚函数的类有vtable存储函数地址,每个对象含vptr指向对应vtable;4. 纯虚函数以“=0”声明,使类成为抽象类,不可实例化;5. 派生类必须实现所有纯虚函数才能实例化;6. 多态提升接口统一性与扩展性,理解vtable机制有助于优化性能。

虚函数是 C++ 实现多态的关键机制。它允许在基类中声明一个函数为 virtual,这样在派生类中可以重写(override)这个函数。当通过基类指针或引用调用该函数时,程序会根据对象的实际类型来决定调用哪个版本的函数,而不是仅仅依据指针或引用的类型。

虚函数的基本语法与使用

在基类中,使用 virtual 关键字声明成员函数:

class Base {
public:
    virtual void show() {
        std::cout << "Base class show\n";
    }
};

class Derived : public Base { public: void show() override { // 重写基类虚函数 std::cout << "Derived class show\n"; } };

当我们用基类指针指向派生类对象并调用 show() 时:

Base* ptr = new Derived();
ptr->show();  // 输出: Derived class show

虽然指针类型是 Base*,但实际调用的是 Derived 的 show() 函数,这就是多态的体现。

虚函数实现多态的原理:虚函数表(vtable)

C++ 编译器通过虚函数表(virtual table,简称 vtable)和虚表指针(vptr)来实现动态绑定。

  • 每个包含虚函数的类都有一个对应的虚函数表,表中存放了该类所有虚函数的地址。
  • 每个该类的对象内部会自动添加一个隐藏的指针(vptr),指向其所属类的虚函数表。
  • 当调用虚函数时,程序通过对象的 vptr 找到虚函数表,再从中查出对应函数的实际地址进行调用。

例如,上述代码中:

  • Base 类有一个 vtable,记录 Base::show() 的地址。
  • Derived 类也有自己的 vtable,其中 Derived::show() 覆盖了继承自 Base 的条目。
  • new Derived() 创建的对象包含一个 vptr,指向 Derived 的 vtable。
  • ptr->show() 触发查表调用,最终执行 Derived::show()。

纯虚函数与抽象类

有时候我们希望基类中的虚函数没有具体实现,只作为接口存在。这时可以使用纯虚函数

class Shape {
public:
    virtual void draw() = 0;  // 纯虚函数
};

class Circle : public Shape { public: void draw() override { std::cout << "Drawing a circle\n"; } };

含有纯虚函数的类称为抽象类,不能实例化对象。只有派生类实现了所有纯虚函数后,才能创建该派生类的对象。

基本上就这些。虚函数让 C++ 支持运行时多态,是面向对象编程中实现接口统一、行为多样的核心工具。理解 vtable 机制有助于掌握其底层工作方式,写出更高效的代码。不复杂但容易忽略细节。


# c++  # 工具  # win  # 面向对象编程  # 面向对象  # 多态  # 成员函数  # 引用调用  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # 指针类型  # function  # 对象  # table  # 派生类  # 重写  # 类中  # 或引用  # 抽象类  # 绑定  # 自己的  # 的是  # 都有 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: LINUX如何开放防火墙端口_Linux firewalld与iptables开放端口命令【安全配置】  Windows 11如何开启文件夹加密(EFS)_Windows 11文件属性中加密内容以保护数据  Windows 10怎么隐藏特定更新补丁_Windows 10使用微软官方工具wushowhide.diagcab  Win11此电脑不在桌面上_Windows 11桌面图标设置找回【步骤】  Win11怎么开启空间音效_Windows11耳机杜比音效与Sonic设置  如何用正则与预处理结合精准拦截拼接式垃圾域名  Win11 C盘满了怎么清理 Win11磁盘清理和存储感知使用教程【新手必看】  php和redis连接超时怎么办_phpredis调试连接问题汇总【指南】  如何使用Golang配置安全开发环境_防止敏感信息泄露  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  Win11如何卸载OneDrive_Win11卸载OneDrive方法【教程】  Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】  c++怎么调用nana库开发GUI_c++ 现代风格窗口组件与事件处理【实战】  Win11怎么设置屏保时间_调整Win11屏幕保护等待时间【详解】  如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法  Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】  php文件怎么变mp4保存_php输出视频流保存为mp4操作【操作】  mac怎么查看wifi密码_MAC查看已连接WiFi密码方法【技巧】  Mac如何解压zip和rar文件?(推荐免费工具)  Windows10如何更改开机密码_Win10登录选项更改密码教程  Go 语言标准库为何不提供泛型 Contains 方法:设计哲学与类型系统约束  如何使用Golang捕获并记录协程panic_保证主程序稳定运行  如何在Golang中实现邮件发送功能_Golang SMTP发送与错误处理示例  Win10如何备份驱动程序_Win10驱动备份步骤【攻略】  如何在Golang中写入XML文件_生成符合规范的XML数据  php下载安装包太大怎么下载_分卷压缩下载方法【教程】  如何用正则表达式精确匹配最多含一个换行符的起止片段  Linux怎么查找死循环进程_Linux系统负载分析与进程彻底结束【教程】  Bpmn 2.0的XML文件怎么画流程图  XAMPP 启动失败(Apache 突然停止)的终极排查与修复指南  c++中如何计算坐标系中两点间距离_c++勾股定理求距离  c++ atoi和atof函数用法_c++字符数组转数字  php485在macos下怎么配置_php485 macOS系统配置指南【解答】  Windows10如何删除Windows.old_Win10磁盘清理系统文件选项  如何在 Django 中修改用户密码后保持会话不丢失  Python网页解析流程_html结构说明【指导】  Python与OpenAI接口集成实战_生成式AI应用场景解析  c++的mutex和lock_guard如何使用 互斥锁保护共享资源【多线程】  c++中如何进行二进制文件读写_c++ read与write函数用法  Win11怎么关闭通知消息_屏蔽Windows 11右下角弹窗通知设置【详解】  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  php485返回数据不完整怎么办_php485数据分包重组处理方法【教程】  如何使用正则表达式精确匹配最多含一个换行符的 start-end 区段  如何在 Go 中创建包含映射(map)的切片(slice)结构  Win11怎么关闭自动更新 Win11永久关闭系统更新的有效方法【技巧】  Win11怎么关闭系统推荐内容_Windows11开始菜单布局设置  windows系统找不到无线网络怎么办_windows WLAN适配器故障排查  Win11快速助手怎么用_Win11远程协助连接教程【工具】  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  LINUX怎么设置系统语言_LINUX修改中文环境 

 2025-11-08

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.