尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
虚函数与纯虚函数:区别、原理与应用场景详解
1. 什么是虚函数虚函数Virtual Function是 C 中用于实现多态的核心机制。在基类中使用virtual关键字声明的成员函数即为虚函数它允许通过基类指针或引用调用派生类中重写的版本从而实现运行时多态。class Animal { public: // 虚函数基类提供默认实现 virtual void speak() { std::cout Animal speaks std::endl; } virtual ~Animal() {} }; class Dog : public Animal { public: // 重写虚函数 void speak() override { std::cout Dog barks std::endl; } }; int main() { Animal* ptr new Dog(); ptr-speak(); // 输出 Dog barks实现多态 delete ptr; return 0; }虚函数通过虚函数表vtable实现。每个含有虚函数的类都维护一张虚函数表表中存放指向各虚函数实现的函数指针。对象中保存一个指向 vtable 的指针vptr调用虚函数时通过 vptr 间接跳转从而实现动态绑定。2. 什么是纯虚函数纯虚函数Pure Virtual Function是一种特殊的虚函数它在基类中只声明而不提供实现或定义为空通过在声明末尾添加 0来标识。含有纯虚函数的类称为抽象类不能直接实例化只能作为基类被派生类继承。class Shape { public: // 纯虚函数只声明不实现 virtual double area() const 0; virtual ~Shape() {} }; class Circle : public Shape { private: double radius; public: Circle(double r) : radius(r) {} // 派生类必须实现纯虚函数 double area() const override { return 3.14159 * radius * radius; } };派生类必须实现基类中的所有纯虚函数否则该派生类仍然是抽象类无法创建对象。3. 虚函数与纯虚函数的区别对比项虚函数纯虚函数声明方式virtual关键字virtual ... 0基类是否提供实现必须提供默认实现通常不提供实现基类能否实例化可以不可以抽象类派生类是否必须重写可选不重写则继承基类实现必须重写设计意图提供可被覆盖的默认行为定义接口规范强制派生类实现4. 虚函数的应用场景4.1 实现运行时多态虚函数最核心的应用是运行时多态。通过基类指针或引用调用派生类方法使同一段代码可以处理不同类型的对象这是面向对象设计的基石。void makeSound(Animal animal) { animal.speak(); // 运行时动态绑定 } int main() { Dog dog; Cat cat; makeSound(dog); // 输出 Dog barks makeSound(cat); // 输出 Cat meows return 0; }4.2 基类提供默认行为派生类按需覆盖当基类能给出合理的默认实现但允许派生类按需覆盖时使用虚函数。例如图形界面框架中控件的绘制、游戏引擎中实体的更新逻辑等。class Widget { public: virtual void draw() { // 默认绘制逻辑 std::cout Drawing base widget std::endl; } }; class Button : public Widget { public: void draw() override { // 按钮专属绘制 std::cout Drawing button std::endl; } };4.3 析构函数声明为虚函数当类被用作基类时析构函数应声明为虚函数确保通过基类指针删除派生类对象时能正确调用派生类析构函数避免内存泄漏。class Base { public: virtual ~Base() { std::cout Base destructor std::endl; } }; class Derived : public Base { public: ~Derived() override { std::cout Derived destructor std::endl; } }; int main() { Base* ptr new Derived(); delete ptr; // 正确调用 Derived 和 Base 的析构函数 return 0; }5. 纯虚函数的应用场景5.1 定义接口规范纯虚函数最常见的用途是定义接口。基类只规定派生类必须提供哪些方法不关心具体实现细节从而实现接口与实现分离。这在插件化架构、驱动开发中非常常见。class Database { public: virtual void connect(const std::string url) 0; virtual void query(const std::string sql) 0; virtual void close() 0; virtual ~Database() {} }; class MySQL : public Database { public: void connect(const std::string url) override { /* MySQL 实现 */ } void query(const std::string sql) override { /* MySQL 实现 */ } void close() override { /* MySQL 实现 */ } }; class PostgreSQL : public Database { public: void connect(const std::string url) override { /* PostgreSQL 实现 */ } void query(const std::string sql) override { /* PostgreSQL 实现 */ } void close() override { /* PostgreSQL 实现 */ } };5.2 模板方法模式在模板方法模式中基类定义算法的骨架将某些步骤声明为纯虚函数由派生类提供具体实现。基类控制流程派生类定制细节。class DataParser { public: void parse() { openFile(); readHeader(); readBody(); // 纯虚函数由派生类实现 closeFile(); } protected: virtual void readBody() 0; void openFile() { /* 通用实现 */ } void closeFile() { /* 通用实现 */ } }; class JSONParser : public DataParser { protected: void readBody() override { // JSON 专属解析逻辑 } };5.3 强制派生类实现关键行为当基类无法给出有意义的默认实现时使用纯虚函数可以强制派生类必须实现该方法避免因遗漏实现而导致的运行时错误。这在框架设计中尤为重要。class Task { public: virtual void execute() 0; // 每个任务必须实现执行逻辑 virtual ~Task() {} }; class ReportTask : public Task { public: void execute() override { // 生成报表 } };5.4 实现多态纯虚函数同样支持多态。通过基类指针或引用调用派生类的方法确保所有派生类都具备统一的行为入口同时强制每个派生类提供自己的实现。void printArea(const Shape shape) { std::cout Area: shape.area() std::endl; } int main() { Circle c(5.0); Rectangle r(4.0, 6.0); printArea(c); // 输出圆的面积 printArea(r); // 输出矩形的面积 return 0; }6. 总结虚函数和纯虚函数是 C 面向对象编程中实现多态和抽象的两大核心工具。虚函数提供可被覆盖的默认实现适合「基类有默认行为、派生类按需定制」的场景纯虚函数定义接口规范强制派生类实现适合「基类只规定契约、不关心实现」的场景。理解两者的区别有助于设计出结构清晰、扩展性强的代码架构。
RELATED

相关推荐

企业新闻发稿选哪个平台?朝闻通全域传播体系实力测评

企业新闻发稿选哪个平台?朝闻通全域传播体系实力测评

评估新闻稿件代发平台综合实力的核心标准,首要取决于平台的媒体资源储备能力。媒体资源覆盖范围越广、层级结构越完善、受众匹配精度越高,稿件的传播曝光潜力就越强,品牌信息也能更精准、高效地触达目标受众。朝闻通深耕品牌传播与新闻宣发领…

📅 2026/9/12 11:21:03
当拆解过AI Berkshire后,原来用的AI投研结论都像在说“正确的废话”

当拆解过AI Berkshire后,原来用的AI投研结论都像在说“正确的废话”

作 者:老余捞鱼 原创不易,转载请标明出处及原作者。 文中示例仅用于技术讨论,不构成任何操作建议。 量化策略开发应以学习和技术交流为目的。 本号不荐股、不卖课、不承诺收益。 市场有风险,请合法合规投资。 本文约 2800 字 | 预计阅读 5-8 分钟,后有开源项目地址,建议先…

📅 2026/11/11 12:53:39
Anima模型+ComfyUI:配置驱动的批量画师风格测试方案

Anima模型+ComfyUI:配置驱动的批量画师风格测试方案

你有没有遇到过这样的情况:拿到一个新的画风控制模型之后,想看看它在不同画师风格下的表现,于是开始手动改提示词、改参数、点运行、保存图片,一个风格一个风格地试。试到第十个的时候,你发现前面的截图已经混在一起&a…

📅 2026/11/10 8:32:33
MORE NEWS

更多资讯

📰

宜昌电工证有补贴吗?学历不高怕报不上名?良心建议来了!

宜昌电工证有补贴吗?学历不高怕报不上名?良心建议来了! 你是不是也担心自己学历不高,考不了电工证?别急,我来给你说说真实情况,帮你把关,少走弯路。…

📰

汕尾哪里报考电工证?外省证能转吗?考前押题帮你稳过

汕尾哪里报考电工证?外省证能转吗?考前押题帮你稳过 之前考的证在外省能不能转过来?这是很多在外地打工的电工朋友最关心的问题。汕尾这边的电工证报考流程其实并不复杂,但如果你是第一次接触,或者你的证是在别省考的,那得提前了解清楚。今天我们就来聊…

📰

潢川考电工证有补贴吗 电工证含金量到底有多高

潢川考电工证有补贴吗 电工证含金量到底有多高 证书过期了不知道怎么复审延期?我同事老王就因为这个问题差点丢了饭碗。他是新乡市某水利工程单位的电工,之前一直在工地负责设备维护和线路安装,没想到电工证过期了他压根没注意,结果去年单位检查时被通报…

📰

电工证属于E类人才吗良心建议帮你搞懂实操考试怕挂科怎么办

电工证属于E类人才吗良心建议帮你搞懂实操考试怕挂科怎么办 实操考试心里没底怕挂科,这是很多正在准备电工证考试的小伙伴的真实写照。面对高压电、复杂线路和各种仪器设备,一不小心就可能操作失误,影响考试成绩。但别急,今天就给你 良心建议…

📰

宜昌电工证有补贴吗?郑州报考避坑指南全攻略

宜昌电工证有补贴吗?郑州报考避坑指南全攻略 不知道去哪报名怕被中介坑,宜昌电工证有补贴吗?这个问题是很多准备考电工证的朋友最先考虑的。尤其是像你这样在济源市政公用工程行业工作的朋友,考证不仅关系到能不能上岗,还可能影响你未来的薪资和职业发展…

📰

高压可以考电工证题库网上查询怎么操作?新乡电工证报名攻略全解析

高压可以考电工证题库网上查询怎么操作?新乡电工证报名攻略全解析 你是不是正为 急需特种作业证才能上岗找工作 而发愁?特别是 高压电工证 ,现在几乎每个工地、电力施工项目都要求持证上岗,连面试都过不了。别急,今天就从 高压可以考电工证题库…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬