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

C++中的虚函数与纯虚函数

文章目录

    • 虚函数 (Virtual Function)
    • 纯虚函数 (Pure Virtual Function)
    • 主要区别
    • 实际应用示例

C++中的虚函数和纯虚函数是实现多态性的重要机制。

虚函数 (Virtual Function)

虚函数是在基类中用virtual关键字声明的函数,它允许派生类重写(override)该函数的实现。当通过基类指针或引用调用虚函数时,会根据对象的实际类型来决定调用哪个版本的函数,这就是动态绑定或运行时多态。

class Base {
public:virtual void show() {cout << "Base class show function" << endl;}virtual ~Base() {}  // 虚析构函数
};class Derived : public Base {
public:void show() override {cout << "Derived class show function" << endl;}
};

纯虚函数 (Pure Virtual Function)

纯虚函数是在虚函数声明后面加上= 0的函数,它没有实现。包含纯虚函数的类被称为抽象类,不能被实例化。派生类必须实现所有纯虚函数才能被实例化。

class AbstractBase {
public:virtual void pureVirtualFunction() = 0;  // 纯虚函数virtual void normalVirtualFunction() {   // 普通虚函数cout << "Normal virtual function" << endl;}virtual ~AbstractBase() {}
};

主要区别

实现方面:虚函数有默认实现,纯虚函数没有实现

类的实例化:包含纯虚函数的类是抽象类,不能实例化;只包含虚函数的类可以实例化

派生类要求:派生类可以选择是否重写虚函数,但必须实现所有继承的纯虚函数

设计意图:虚函数提供默认行为但允许定制,纯虚函数强制派生类提供具体实现

实际应用示例

#include <iostream>
#include <vector>
#include <memory>
using namespace std;// 抽象基类
class Animal {
public:virtual void makeSound() = 0;  // 纯虚函数virtual void sleep() {         // 虚函数cout << "Animal is sleeping" << endl;}virtual ~Animal() {}
};class Dog : public Animal {
public:void makeSound() override {cout << "Woof!" << endl;}
};class Cat : public Animal {
public:void makeSound() override {cout << "Meow!" << endl;}void sleep() override {cout << "Cat is sleeping on the sofa" << endl;}
};int main() {vector<unique_ptr<Animal>> animals;animals.push_back(make_unique<Dog>());animals.push_back(make_unique<Cat>());for (auto& animal : animals) {animal->makeSound();  // 多态调用animal->sleep();      // 多态调用}return 0;
}

这种设计模式在实际开发中非常有用,比如图形界面框架中的控件基类、游戏引擎中的实体类、以及各种设计模式的实现中都会大量使用虚函数和纯虚函数来实现灵活的多态架构。

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

相关文章:

  • 【PaddleOCR】快速集成 PP-OCRv5 的 Python 实战秘籍--- PaddleOCR实例化 OCR 对象的参数介绍
  • css函数写个loading动画 | css预编译scss使用
  • YOLOv11性能评估全解析:从理论到实战的指标指南
  • GitHub已破4.5w star,从“零样本”到“少样本”TTS,5秒克隆声音,冲击传统录音棚!
  • 智能客服的进化论:当服务遇见 AI 的化学反应
  • 数据结构:递归:斐波那契数列(Fibonacci Sequence)
  • Android布局管理器实战指南:从LinearLayout到ConstraintLayout的优化之旅
  • 计算机网络第十章——网络层
  • 基于Netty-WebSocket构建高性能实时通信服务
  • nginx的管理员启动,停止,重启
  • 前端处理跨域的4种方式
  • uniapp+vue写小程序页面,实现一张图片默认放大后,可以在容器内上下左右拖动查看
  • JavaScript 安装使用教程
  • Web3区块链有哪些岗位?
  • 141.在 Vue 3 中使用 OpenLayers Link 交互:把地图中心点 / 缩放级别 / 旋转角度实时写进 URL,并同步解析显示
  • 【MyBatis保姆级教程下】万字XML进阶实战:配置指南与深度解析
  • python高级变量VIII
  • 转录组分析流程(四):Cox+Lasso筛选预后基因
  • JVM内存模型与垃圾回收机制分析
  • 【java链式调用流操作】
  • Python实现NuScenes数据集可视化:从3D边界框到2D图像的投影原理与实践
  • mac部署dify
  • 笔记/计算机网络
  • 【数据结构】 排序算法
  • beego打包发布到Centos系统及国产麒麟系统完整教程
  • 【文件读取】open | with | as
  • 实体类JavaBean
  • 到底什么是“数字化”?数字化的本质是什么?
  • 从输入到路径:AI赋能的地图语义解析与可视化探索之旅(2025技术全景)
  • 边截图边操作?试试 Snipaste 的浮动贴图功能