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

纯虚函数(Pure Virtual Function)详解

纯虚函数(Pure Virtual Function)详解

1. 基本定义

纯虚函数是C++中一种特殊的虚函数,用于在基类中定义抽象接口。
语法形式:在虚函数声明后加上 = 0

class Base {
public:
    virtual void func() = 0; // 纯虚函数
};

2. 核心特性

  • 必须被派生类重写:所有继承该基类的具体子类都必须实现这个函数。
  • 基类不可实例化:包含纯虚函数的类称为抽象类,不能直接创建对象。
Base obj; // 错误!抽象类不能实例化

3. 与普通虚函数的区别

特性普通虚函数纯虚函数
是否有默认实现可以有默认实现(可选的)无默认实现(必须由子类实现)
基类能否实例化可以(基类为具体类)不能(基类是抽象类)
是否强制子类重写否(子类可选择是否重写)是(子类必须重写)

4. 典型应用场景

  • 定义接口规范:强制所有子类实现统一的方法。
  • 实现多态:通过基类指针调用不同子类的实现。
  • 框架设计:例如在GUI库中定义Shape基类,要求子类必须实现 draw() 方法。

示例代码:

// 抽象基类:动物
class Animal {
public:
    virtual void makeSound() = 0; // 纯虚函数
};

// 具体子类:狗
class Dog : public Animal {
public:
    void makeSound() override {    // 必须实现
        cout << "Woof!" << endl;
    }
};

// 具体子类:猫
class Cat : public Animal {
public:
    void makeSound() override {    // 必须实现
        cout << "Meow!" << endl;
    }
};

// 使用多态
Animal* animal1 = new Dog();
Animal* animal2 = new Cat();
animal1->makeSound(); // 输出 "Woof!"
animal2->makeSound(); // 输出 "Meow!"

5. 高级用法

纯虚析构函数

抽象类需要析构函数时,必须显式定义(即使它是纯虚的):

class AbstractBase {
public:
    virtual ~AbstractBase() = 0; // 纯虚析构函数
};

AbstractBase::~AbstractBase() {} // 必须提供实现

接口类(C++11+)

使用 override 关键字明确表示重写:

class Interface {
public:
    virtual void method() = 0;
    virtual ~Interface() = default;
};

class Concrete : public Interface {
public:
    void method() override { /* 实现 */ }
};

6. 注意事项

子类未实现纯虚函数

若子类未完全实现所有纯虚函数,该子类仍为抽象类。

class Bird : public Animal { 
    // 未实现 makeSound(), Bird 仍是抽象类
};
Bird b; // 编译错误!

多继承中的纯虚函数

避免多继承的纯虚函数冲突,需明确指定实现:

class A { public: virtual void func() = 0; };
class B { public: virtual void func() = 0; };
class C : public A, public B {
public:
    void func() override { /* 统一实现 */ }
};

7. 实际工程意义

  • 强制接口一致性:确保不同模块遵循统一规范(如插件系统)。
  • 解耦设计:调用方依赖抽象接口,而非具体实现。
  • 扩展性:新增子类时无需修改基类代码(开闭原则)。

总结

纯虚函数是C++实现多态和接口抽象的核心机制,通过强制子类实现特定方法,为大型系统的模块化设计提供基础保障。

相关文章:

  • 笔试专题(九)
  • Android 系统的进程保活方案的一些思路
  • nmcli创建wpa-psk2 wifi热点
  • 2.0 全栈运维管理:Linux网络基础核心概念解析、Proxmox网络组件详解、虚拟化网络模型分类
  • AI 课招生啦
  • 英语单词 list 11
  • IPV6应用最后的钥匙:DDNS-GO 动态域名解析工具上手指南--家庭云计算专家
  • Vue3+elementPlus中 树形控件封装
  • 从自然语言到 JSON 数据交互:探索 MCP 协议的自动化任务实现
  • 【论文阅读】UniAD: Planning-oriented Autonomous Driving
  • mysql建表一对多--多对多之间的外键关联
  • 202529 | RocketMQ 简介 + 安装 + 集群搭建 + 消费模式 + 消费者组
  • DHCP中继
  • 安卓关机和重启源码流程
  • 【HDFS入门】Hadoop 2.0+ HDFS核心架构深度解析:高可用设计揭秘
  • C. Good Subarrays
  • 操作系统基础:07 我们的任务
  • MySQL-锁
  • leetcode 3508 设计路由器 模拟 深拷贝 二分 bound
  • (即插即用模块-特征处理部分) 三十二、(TGRS 2024) MDAF 多尺度双表示对齐过滤器
  • 专访|金七猫奖得主:以非遗为舟,在现实题材中疗愈与成长
  • 习近平:坚持科学决策民主决策依法决策,高质量完成“十五五”规划编制工作
  • 第十届青春文学奖揭晓,梁晓声获特别奖
  • 江南考古文脉探寻
  • 以色列媒体:哈马斯愿意释放部分人员换取两个月停火
  • 学者三年实地调查被判AI代笔,论文AI率检测如何避免“误伤”