当前位置: 首页 > news >正文

虚函数 vs 纯虚函数 vs 静态函数(C++)

🧩 一图看懂:虚函数 vs 纯虚函数

特性虚函数(Virtual)纯虚函数(Pure Virtual)
语法virtual void foo();virtual void foo() = 0;
是否必须实现✅ 必须在类中实现❌ 不在基类实现,派生类必须实现
是否可被重写✅ 可重写(override)✅ 必须被重写(override)
用途支持运行时多态,可选重写强制派生类必须重写,实现接口规范
是否构成抽象类❌ 不一定✅ 是抽象类,不能实例化

✅ 虚函数(virtual

  • 语法virtual void speak();

  • 作用:支持 运行时多态

  • 特性

    • 有默认实现

    • 可以被子类覆盖

    • 必须是非静态成员函数

  • 使用场景:需要在子类中覆盖行为(但不是强制)


✅ 纯虚函数(= 0

  • 语法virtual void speak() = 0;

  • 作用:创建接口函数,强制子类必须实现

  • 特性

    • 没有默认实现

    • 子类 必须重写,否则也是抽象类

    • 所在类称为 抽象类不能被实例化

  • 用途:面向接口编程、设计规范

class Animal {

public:

    virtual void speak() = 0; // 纯虚函数

};


✅ 静态成员函数(static

  • 属于类本身,而不是对象

  • 不能是虚函数,因为没有 this 指针

  • 无法访问非静态成员(因为不依赖对象)

class A {

public:

  static void sayHello(); // 和对象无关

};


🧠 三、抽象类(包含纯虚函数的类)

  • 语法:类中至少一个函数是 virtual void foo() = 0;

  • 特点

    • 不能被实例化

    • 派生类必须实现纯虚函数,才可以实例化

    • 通常作为接口使用,规范子类的行为


📌 四、虚函数工作原理:虚函数表(vtable)

  • 编译器为类创建一张虚函数表

  • 对象内部有个隐藏指针指向这个表(vptr)

  • 当你调用虚函数时,实际会通过 vtable 找到正确的函数地址 ➜ 实现多态

🔑 小结:口诀记忆版

项目口诀
const 指针左定值,右定向,const 修饰不变量
虚函数支持多态,可选覆盖
纯虚函数没有实现,强制子类实现,是接口
抽象类有纯虚函数,不可实例化,只能继承
静态函数类级函数,不能访问对象成员,不能是虚函数
多态原则通过指针/引用访问虚函数,才会发生运行时多态
析构函数如果类有虚函数,析构函数也应为虚函数,防止内存泄漏

详情请见:C++ 虚函数和纯虚函数的区别 | 菜鸟教程

http://www.dtcms.com/a/171338.html

相关文章:

  • 在Qt Creator中使用CUDA
  • 25.5.4数据结构|哈夫曼树 学习笔记
  • mysql中int(1) 和 int(10) 有什么区别?
  • 基于python的task--时间片轮询
  • 【Redis】哈希(hash)与列表(list)
  • 【赵渝强老师】TiDB的MVCC机制
  • 【MySQL数据库】用户管理
  • day15 python 复习日
  • LabVIEW温控系统热敏电阻滞后问题
  • SpringBoot校园失物招领平台源码开发实现
  • CFD计算流体力学开源工程介绍
  • 数据库-数据类型,表的约束和基本查询操作
  • 探秘 RocketMQ 的 DLedgerServer:MemberState 的技术解析与深度剖析
  • HttpPrinter 是一款功能强大的跨平台 Web 打印解决方案
  • JAVA实战开源项目:纺织品企业财务管理系统 (Vue+SpringBoot) 附源码
  • C++基础代码解释
  • 【iOS】消息流程探索
  • 苍穹外卖12
  • AD 多通道设计---多图纸
  • Python----机器学习(模型评估:准确率、损失函数值、精确度、召回率、F1分数、混淆矩阵、ROC曲线和AUC值、Top-k精度)
  • vue3 - keepAlive缓存组件
  • Python的ArcPy基于Excel表格对大量遥感影像批量重分类
  • 传感器数据处理笔记
  • Spring Boot Jpa封装快速构建Specification、OrderBy、Pageable的查询条件
  • Docker 容器化部署
  • Learning vtkjs之MultiSliceImageMapper
  • 数据分析之药物-基因-代谢物
  • Linux系统编程---进程间管道通信
  • 通讯协议开发实战:从零到一打造企业级通信解决方案
  • Spring AI版本1.0.0-M6和M8效果比较