虚函数通过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() 函数,这就是多态的体现。
C++ 编译器通过虚函数表(virtual table,简称 vtable)和虚表指针(vptr)来实现动态绑定。
例如,上述代码中:
有时候我们希望基类中的虚函数没有具体实现,只作为接口存在。这时可以使用纯虚函数:
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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。