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

c++ 纯虚函数

目录

什么是纯虚函数?

抽象类

如何使用纯虚函数实现接口

纯虚函数的特性

必须被重写:

可以有默认析构函数:

可以包含非纯虚函数:

纯虚函数与接口的设计意义

纯虚函数 vs 普通虚函数

注意事项

实际应用场景

什么是纯虚函数?

纯虚函数是在基类中声明但没有提供实现的虚函数。通过在函数声明后添加 = 0,它被标记为“纯虚”。纯虚函数的目的是强制派生类提供自己的实现。

语法:

virtual 返回类型 函数名(参数列表) = 0;

示例: 

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

注意:纯虚函数没有函数体 {},= 0 表示它是纯虚的。 

抽象类

一旦一个类包含至少一个纯虚函数,它就变成了抽象类(Abstract Class)。抽象类不能直接实例化对象,只能作为基类被继承。

示例:

class Animal {
public:virtual void sound() = 0; // 纯虚函数
};int main() {// Animal a; // 错误!不能实例化抽象类return 0;
}

派生类必须实现所有纯虚函数,否则它仍然是抽象类,无法实例化。 

如何使用纯虚函数实现接口

在 C++ 中,纯虚函数常用于定义接口。接口是一个抽象类,其中所有成员函数都是纯虚函数(没有实现),只定义行为规范,具体实现由派生类完成。这类似于其他语言(如 Java 或 C#)中的 interface。

示例:

#include <iostream>
using namespace std;// 接口(抽象基类)
class Shape {
public:virtual void draw() = 0;        // 纯虚函数virtual double area() = 0;      // 纯虚函数virtual ~Shape() {}             // 虚析构函数
};// 实现接口的派生类
class Circle : public Shape {
private:double radius;
public:Circle(double r) : radius(r) {}void draw() override {cout << "Drawing a circle" << endl;}double area() override {return 3.14 * radius * radius;}
};class Rectangle : public Shape {
private:double width, height;
public:Rectangle(double w, double h) : width(w), height(h) {}void draw() override {cout << "Drawing a rectangle" << endl;}double area() override {return width * height;}
};int main() {Shape* shapes[2];shapes[0] = new Circle(5.0);shapes[1] = new Rectangle(4.0, 3.0);for (int i = 0; i < 2; i++) {shapes[i]->draw();cout << "Area: " << shapes[i]->area() << endl;}delete shapes[0];delete shapes[1];return 0;
}

输出: 

Drawing a circle
Area: 78.5
Drawing a rectangle
Area: 12

在这个例子中:

  • Shape 是一个接口,定义了 draw 和 area 两个纯虚函数。

  • Circle 和 Rectangle 是具体类,实现了 Shape 接口。

纯虚函数的特性

  1. 必须被重写:

    • 派生类如果不实现纯虚函数,仍然是抽象类,无法实例化。

    • 使用 override 关键字(C++11)可以明确表示重写,增强代码可读性并避免错误。

  2. 可以有默认析构函数:

    • 抽象类通常定义一个虚析构函数(可以有实现),以确保通过基类指针删除派生类对象时正确释放资源。

  3. 可以包含非纯虚函数:

    • 抽象类不仅可以有纯虚函数,还可以有普通成员函数甚至数据成员,但只要有纯虚函数,它就是抽象类。

示例(抽象类包含实现):

class Animal {
public:virtual void sound() = 0; // 纯虚函数void sleep() {            // 普通成员函数cout << "Sleeping..." << endl;}
};class Dog : public Animal {
public:void sound() override {cout << "Woof" << endl;}
};int main() {Dog d;d.sound();  // 输出 "Woof"d.sleep();  // 输出 "Sleeping..."return 0;
}

纯虚函数与接口的设计意义

纯虚函数在 C++ 中扮演了接口的角色,主要用于:

  1. 定义规范:强制派生类实现特定行为。

  2. 实现多态:通过基类指针或引用调用派生类的实现。

  3. 解耦合:代码依赖抽象接口而非具体实现,便于扩展和维护。

例如,在一个图形系统中,Shape 接口定义了所有形状必须有的行为(draw 和 area),具体形状(如 Circle、Rectangle)可以根据需要实现。

纯虚函数 vs 普通虚函数

特性

纯虚函数 (

= 0

)

普通虚函数

是否有实现

无实现

有默认实现

是否强制重写

是,派生类必须实现

否,可选择重写

类是否抽象

是,包含纯虚函数的类是抽象类

否,可实例化

注意事项

  • 不能直接调用纯虚函数:

    • 因为纯虚函数没有实现,直接调用会导致链接错误(除非在基类中意外提供了实现,但这不常见)。

  • 析构函数可以是纯虚的,但需提供实现:

    class Base {
    public:virtual ~Base() = 0; // 纯虚析构函数
    };
    Base::~Base() {}         // 必须提供实现

实际应用场景

  • 插件系统:定义插件接口,具体插件类实现功能。

  • 框架开发:如游戏引擎中,Entity 接口定义 update() 和 render(),具体实体(如玩家、敌人)实现。

  • 跨平台开发:抽象硬件接口(如 IStorage),不同平台提供具体实现。


http://www.mrgr.cn/news/93314.html

相关文章:

  • c++ 接口/多态
  • 国内支持Stable Diffusion模型的平台
  • CSS—属性继承与预处理器:2分钟掌握预处理器
  • 机器学习--特征选择
  • 自然语言模型(NLP)介绍
  • 鬼泣:项目前置设置杂项
  • 【零基础C语言】第四节 数组
  • QT5 GPU使用
  • vLLM代码推理Qwen2-VL多模态大模型(远程服务器解决方案,无需UI)
  • 机器学习数学基础:40.结构方程模型(SEM)中卡方值与卡方自由度比
  • 人工智能神经网络基本原理
  • cursor使用经验分享(java后端服务开发向)
  • Dify+DeepSeek | Excel数据一键可视化(创建步骤案例)(echarts助手.yml)(文档表格转图表、根据表格绘制图表、Excel绘制图表)
  • 启智平台华为昇腾910B 运行DeepSeek Janus-Pro-7/1B
  • Dify 开源大语言模型应用开发平台使用(一)
  • 【Oracle学习笔记】1.数据库组成对象
  • mybatis日期格式与字符串不匹配bug
  • 突破光学成像局限:全视野光学血管造影技术新进展
  • 网络编程之TCP协议
  • YOLOv8改进SPFF-LSKA大核可分离核注意力机制