虚函数允许派生类重写并实现运行时多态,可提供默认实现;纯虚函数强制派生类实现特定接口,无函数体且使类成为抽象类。1. 虚函数用virtual声明,支持动态绑定,可通过基类指针调用对应派生类版本;2. 纯虚函数以=0结尾,不含实现,包含它的类不能实例化;3. 抽象类用于定义接口规范,提升代码扩展性与维护性;4. C++通过vtable和vptr实现虚函数调用机制,纯虚函数在vtable中标记为未实现;5. 只要类有纯虚函数即为抽象类,必须由派生类实现后才能实例化。两者共同支撑C++多态与面向对象设计。
虚函数和纯虚函数都是C++实现多态的重要机制,但它们在用途和语法上存在关键区别。理解这些差异有助于正确设计类层次结构,尤其是涉及抽象类和接口时。
虚函数是在基类中使用virtual关键字声明的成员函数,允许派生类重写其行为。当通过基类指针或引用调用该函数时,程序会根据实际对象类型选择对应的版本,实现运行时多态。
虚函数可以有默认实现,基类提供通用逻辑,派生类可根据需要覆盖。
例如:
class Animal {
public:
virtual void speak() {
cout << "Some sound" << endl;
}
};
class Dog : public Animal {
public:
void speak(
) override {
cout << "Woof!" << endl;
}
};
这里speak()是虚函数,Animal对象调用输出默认声音,而Dog对象输出“Woof!”。
纯虚函数是一种特殊的虚函数,声明时以= 0结尾,不提供函数体。包含纯虚函数的类称为抽象类,不能实例化。
它的作用是定义接口规范,要求所有派生类必须实现该函数,否则派生类仍是抽象类。
例如:
class Shape {
public:
virtual double area() = 0; // 纯虚函数
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() override {
return 3.14159 radius radius;
}
};
Shape是抽象类,无法创建实例。只有实现了area()的Circle等具体类才能被实例化。
C++通过虚函数表(vtable)实现动态 dispatch。每个含有虚函数的类都有一个vtable,存储指向各虚函数的指针。对象内部包含一个vptr,指向所属类的vtable。
当调用虚函数时,程序通过vptr找到vtable,再定位到实际函数地址。这个过程在运行时完成,支持多态。
抽象类的vtable中,纯虚函数对应的位置通常标记为未实现(或指向错误处理函数),确保不会被直接调用。
抽象类常用于设计框架或接口,比如:
基本上就这些。虚函数提供可选重写的多态能力,纯虚函数则强制派生类实现特定接口,两者结合支撑了C++面向对象设计中的重要模式。不复杂但容易忽略的是,哪怕只有一个纯虚函数,类就变成抽象类,不能再直接实例化。
# c++
# 区别
# speak
# 面向对象
# 多态
# 成员函数
# 引用调用
# 指针
# 虚函数
# 纯虚函数
# 接口
# 对象
# 抽象类
# 派生类
# 重写
# 绑定
# 的是
# 都是
# 是在
# 都有
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
如何在Golang中使用time处理时间_Golang time时间解析与格式化方法
C++中的协变与逆变是什么?C++函数指针与返回类型详解【类型系统】
VSC怎么在PHP中调试MySQL_数据库交互排查技巧【教程】
如何关闭Win10自动更新更新_Win10系统自动更新双重关闭技巧
Mac的Time Machine怎么用_Mac系统备份与数据恢复【完整指南】
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
LINUX的SELinux是什么_详解LINUX强制访问控制系统的入门与配置
Win11怎么更改任务栏颜色_Windows11个性化重音色设置
PythonDocker高级项目部署教程_多容器管理与CI/CD流水线
Win11怎么关闭触摸键盘图标_Windows11任务栏系统托盘设置
如何在 Go 中判断变量是否为函数类型
Python大文件处理策略_内存优化说明【指导】
WindowsUSB驱动安装异常怎么办_USB驱动重建与恢复教程
PHP主流架构怎么部署到Docker_容器化流程【操作】
PythonFastAPI项目实战教程_API接口与异步处理实践
Windows怎样关闭开始菜单推荐广告_Windows关闭开始菜单推荐设置【步骤】
How to Properly Use NumPy in VS Code
如何开启Windows的远程服务器管理工具(RSAT)?(管理服务器)
使用类变量定义字符串常量时的类型安全最佳实践
Win11怎么关闭右下角弹窗_Win11拦截系统通知广告【设置】
如何使用Golang实现多重错误处理_Golangerror组合与判断方法
Windows10怎么备份注册表_Windows10注册表备份步骤【教程】
Python脚本参数接收_sys与argparse解析【指导】
MySQL 中使用 IF 和 CASE 实现查询字段的条件映射
Win11怎么硬盘分区 Win11新建磁盘分区详细教程【步骤】
php中::能访问全局变量吗_全局作用域与类作用域区分【操作】
Go语言中slice追加操作的底层共享机制解析
Win11怎么更改鼠标指针方案_Windows11自定义鼠标光标样式与大小
Python数据挖掘核心算法实践_聚类分类与特征工程
Windows10怎么卸载预装软件_Windows10预装软件卸载步骤【教程】
如何在 Go 中正确反序列化多个并列的 XML 元素(而非 XML 数组)
Win11怎么检查TPM2.0模块_Windows11受信任平台模块开启状态查询
Win11怎么更改输入法顺序_Win11调整语言首选位置【设置】
Win11怎么关闭贴靠布局_Win11禁用窗口最大化时的布局菜单
Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
Linux如何申请SSL免费证书_Linux下Certbot安装与Nginx自动续期【指南】
Win11用户账户控制怎么关_Win11关闭UAC弹窗提示【设置】
Win11无法识别耳机怎么办_解决Win11插耳机没声音问题【步骤】
Win11如何设置开机问候语 Win11修改登录界面提示【技巧】
Drupal 中 HTML 链接被双重转义导致渲染异常的解决方案
Windows10蓝屏SYSTEM_SERVICE_EXCEPTION_Win10驱动冲突排查
Win11怎么设置虚拟内存最佳大小_Windows11性能选项自定义分页文件
如何在 Windows 11 中使用 AlomWare 工具箱
Win11怎么查看电脑配置_Win11硬件配置详细查询方法【详解】
Win10如何卸载自带Edge_Win10彻底卸载Edge浏览器教程【攻略】
Win11怎么设置闹钟_Windows 11时钟应用闹钟设置指南【详解】
用lighttpd能运行php吗_lighttpd配置php步骤【教程】
如何在 Python 测试中动态配置 @backoff 装饰器的重试次数
如何使用Golang捕获测试日志_Golang testing日志记录方法
Python函数接口稳定性_版本演进解析【指导】
2025-11-14
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。