当前位置: 首页 > 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.xdnf.cn/news/278137.html

相关文章:

  • 原型模式(Prototype Pattern)
  • drawDB:打造高效数据库设计流程
  • Go-Spring 全新版本 v1.1.0
  • 潮乎盲盒商城系统全开源多级分销推广海报奖品兑换试玩概率OSS云存储多端源码
  • 工业大模型:从设备诊断到工艺重构
  • 从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 3 |混合定位实战:Wi-Fi RTT / LoRa / BLE RSSI AoA 多源融合
  • node.js为什么产生?
  • Qt基础知识记录(终篇)
  • 前端面试每日三题 - Day 24
  • SpringCloud教程 — 无废话从0到1逐步学习
  • 小刚说C语言刷题—1324扩建鱼塘问题
  • C++基础代码解释
  • dubbo 参数校验-ValidationFilter
  • KEIL5环境下利用HAL库开发STM32项目_工程搭建方法
  • 5.7/Q1,GBD数据库最新文章解读
  • org.apache.poi——将 office的各种类型文件(word等文件类型)转为 pdf
  • 解决 Builroot 系统编译 perl 编译报错问题
  • jeecg查询指定时间
  • 【分享】4D视差壁纸
  • Java运算符学习笔记
  • 【React Hooks原理 - useCallback、useMemo】
  • 大根堆+小根堆 问题
  • 【C++】封装unordered_set和unordered_map
  • 如何快速获取GPU参数,并解读其性能?
  • 【翻译、转载】【译文】图解模型上下文协议(MCP)
  • Day3:设置页面全局渐变线性渐变背景色uniapp壁纸实战
  • SALOME源码分析: SolverLab
  • 【Trae+LucidCoder】三分钟编写专业Dashboard页面
  • LabVIEW温控系统热敏电阻滞后问题
  • C++类_嵌套类