c++ 虚函数和纯虚函数有什么区别_c++中虚函数机制与抽象类解析


虚函数允许派生类重写并实现运行时多态,可提供默认实现;纯虚函数强制派生类实现特定接口,无函数体且使类成为抽象类。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中,纯虚函数对应的位置通常标记为未实现(或指向错误处理函数),确保不会被直接调用。

抽象类常用于设计框架或接口,比如:

  • 定义统一操作接口(如draw()update()
  • 隐藏具体实现细节
  • 提高代码扩展性和可维护性

基本上就这些。虚函数提供可选重写的多态能力,纯虚函数则强制派生类实现特定接口,两者结合支撑了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

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

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

点击免费数据支持

提交您的需求,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.