C++那些事--个人学习记录02(虚函数&纯虚函数%多态)

深入解析C++多态:从虚函数表到实战应用 多态是面向对象编程的核心概念之一,它允许通过基类接口调用派生类的具体实现,是实现代码复用和扩展性的关键技术。其底层原理依赖于虚函数表(vtable)和虚函数表指针(vptr)机制,编译器在运行时通过动态绑定实现函数调用的正确分发。理解这一机制对于编写高效、健壮的C++代码至关重要,它能帮助开发者避免对象切片、内存泄漏等常见陷阱,并优化程序性能。在工程实践中,多态广泛应用于工厂模式、策略模式等设计模式,以及插件架构和智能指针管理中,是实现模块解耦和系统可扩展性的基础。本文以C++为例,深入探讨虚函数表的构建、 阅读详情

如果一个类声明了至少一个虚函数,通常意味着这个类是为多态而设计的,它将成为一个多态类,支持运行时动态绑定和继承体系中的多态行为。

  • 编译器会为多态类生成一个虚函数表(vtable),并为每个对象添加一个虚函数指针(vptr),用于支持动态绑定。
  • 注意:类中声明了虚函数,其派生类并不是必须重写(override)这个虚函数。
    在 C++ 中,当一个基类声明了一个虚函数,派生类可以选择性地重写它,但不是强制的。
    如果派生类没有重写该虚函数,则会继承基类中该函数的实现。
    如果派生类重写了该虚函数,则通过基类指针或引用调用该函数时,会根据对象的实际类型调用派生类的版本,实现多态。
    示例:
#include <iostream>

class Base {
public:
    virtual void show() {
        std::cout << "Base show" << std::endl;
    }

    virtual void greet() {
        std::cout << "Hello from Base" << std::endl;
    }
};

class Derived1 : public Base {
public:
    // 重写了 show(),但没有重写 greet()
    void show() override {
        std::cout << "Derived1 show" << std::endl;
    }
};

class Derived2 : public Base {
    // 没有重写任何虚函数,完全继承基类实现
};

int main() {
    Derived1 d1;
    Derived2 d2;

    Base* ptr1 = &d1;
    Base* ptr2 = &d2;

    ptr1->show();  // 输出: "Derived1 show"  (被重写)
    ptr1->greet(); // 输出: "Hello from Base" (未被重写,使用基类实现)

    ptr2->show();  // 输出: "Base show" (未被重写)
    ptr2->greet(); // 输出: "Hello from Base"

    return 0;
}
  • 特殊情况:纯虚函数
    如果你强制要求派生类必须重写某个函数,你应该使用 纯虚函数(pure virtual function):
class Base {
public:
    virtual void mustOverride() = 0; // 纯虚函数
};

class Derived : public Base {
public:
    void mustOverride() override { // 必须重写,否则无法实例化
        std::cout << "Implemented in Derived" << std::endl;
    }
};
  • 包含纯虚函数的类是抽象类(abstract class),不能直接实例化。
  • 派生类必须重写所有纯虚函数,否则它本身也是抽象类,无法实例化。因为继承后其虚函数还是虚函数,因此重写的时候不必再写virtual。

所以:声明了虚函数 ≠ 派生类必须重写,除非是纯虚函数。

C++ 知识补充 向量(vector)是一个封装了动态大小数组的顺序容器(SequenceContainer)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。C++中map提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在map中出现一次;第二个称之为该关键字的对应值。 阅读详情

相关推荐

告别虚函数性能焦虑:深入剖析C++多态的现代设计模式

本文将深入探讨C++中virtual函数的性能瓶颈及其替代方案。通过分析虚函数的内存开销、运行时性能损耗和优化阻碍等核心问题,文章提出4种经过实战验证的替代策略:1) Non-Virtual Interface模式通过非虚接口封装虚实现;2) 函数指针成员实现策略模式;3) std::function提供类型安全的可调用对象;4) CRTP模板实现静态多态。每种方案均附有详细代码示例、优劣分析和适用场景建议,帮助开发者在保持代码灵活性的同时显著提升性能表现。文章特别适合游戏开发、HPC等对性能敏感领域的C+

weixin_45715405的博客 226

C++多态与虚函数:从底层原理到设计模式实战

多态是面向对象编程的核心概念,它允许通过统一的接口处理不同的数据类型,实现了接口与实现的分离。其底层原理依赖于虚函数表(vtable)和动态绑定机制,编译器为每个包含虚函数的类生成vtable,对象通过虚函数指针(vptr)在运行时确定调用哪个函数实现。这一机制极大地提升了代码的可扩展性和可维护性,是构建大型、复杂软件系统的基石。在工程实践中,多态广泛应用于GUI框架、游戏引擎、插件系统等场景,通过抽象类和纯虚函数定义清晰契约。结合智能指针(如std::unique_ptr)和现代C++特性(如overri

weixin_30376509的博客 439

jmeter小白下载安装步骤

本文仅仅简单介绍了jmeter工具的下载安装,以及基础的操作步骤。

昔年@曦的博客 3492

为什么C++多态依赖虚函数表?99%的开发者答不全

深入解析c++ 多态的实现原理虚函数表,揭示多态机制底层逻辑。适用于继承体系中动态绑定场景,通过虚函数表实现运行时多态,提升程序扩展性与灵活性。核心机制清晰图解,99%开发者忽略的细节全剖析,值得收藏

LogicWander的博客 792

陀螺仪选型避坑指南:为什么IMU660RA是智能车竞赛的性价比之选?

本文针对智能车竞赛场景,提供陀螺仪选型避坑指南,并深度解析为何IMU660RA成为性价比之选。文章指出,竞赛选型应避免盲目追求高性能“黑盒”模块,而应注重原始数据获取与算法开发。IMU660RA以其良好的常温稳定性、适中的噪声水平、极致的性价比和丰富的生态支持,成为帮助参赛者深入理解姿态解算原理、进行“白盒开发”的理想教学与实践平台。

tech5的博客 880

S32DS IDE调试技巧:如何用条件断点精准捕获汽车电子MCU的硬件状态变化

本文详细介绍了S32DS IDE中条件断点功能在汽车电子MCU开发中的应用技巧。通过精准捕获硬件状态变化,工程师可以高效调试外设寄存器异常、时序敏感型交互等复杂场景,大幅提升汽车电子系统的开发效率。文章还提供了多种实战案例和性能优化建议,帮助开发者充分利用S32DS的调试功能。

CAT789的专栏 207

C++多态机制解析:从虚函数表到设计模式应用

面向对象编程中的多态是C++核心特性之一,通过虚函数表(vtable)实现运行时动态绑定。虚函数作为实现多态的关键技术,允许基类指针调用派生类的特定实现,这种机制在接口设计、工厂模式等场景中具有重要价值。从编译器角度看,每个包含虚函数的类都会生成虚函数表,存储函数指针供运行时查询。性能优化方面,可运用final关键字减少虚函数调用开销,或采用CRTP模式提升执行效率。在多线程环境下,需特别注意虚函数调用的线程安全问题,合理使用互斥锁保护共享资源。现代C++还引入了override和final关键字,使多态实

weixin_30512043的博客 358

Vue3 与 Bpmn-js:打造现代化 BPMN 流程设计器

随着业务流程的复杂化,流程设计器成为企业级应用中不可或缺的一部分。BPMN(Business Process Model and Notation)是一种标准的业务流程建模语言,广泛应用于业务流程管理。本文将介绍如何使用 Vue3 和 Bpmn-js 打造一个现代化的 BPMN 流程设计器。

九天的专栏 2115

C++多态机制深度解析:从虚函数表到设计模式实战

面向对象编程中的多态机制是实现代码灵活性和可扩展性的核心技术。其原理基于虚函数表与动态绑定机制,在编译时为每个包含虚函数的类生成虚函数表,对象通过虚函数表指针在运行时确定实际调用的函数实现。这一机制的技术价值在于实现了“开闭原则”,使得系统对扩展开放而对修改关闭,大幅提升了代码的可维护性。在应用场景上,多态广泛应用于GUI框架、游戏引擎、支付系统等需要支持多种行为变体的复杂系统中。本文通过C++虚函数表的底层实现和电商支付系统的实战案例,深入剖析了多态在构建灵活软件架构中的关键作用,特别是虚函数表如何支撑动

weixin_34074740的博客 413

Nvidia Driveos SDK/PDK介绍

NVIDIA DRIVEOS SDK/PDK介绍

u011803281的博客 2174

Unity引擎开发:复杂动作系统_动作捕捉数据的应用与整合

通过以上步骤,我们可以在Unity中有效地应用和整合动作捕捉数据,以实现更加真实和流畅的动画效果。从导入文件格式的选择,到预处理和优化,再到实时应用和调试验证,每一步都至关重要。希望本文能帮助你在Unity项目中更好地利用动作捕捉数据,提升动画质量和性能。

chenlz2007的博客 957

C++ 虚函数和虚表

几篇写的不错的文章,本文是整合了这几篇文章,感谢这些大佬 https://www.jianshu.com/p/00dc0d939119 https://www.cnblogs.com/hushpa/p/5707475.html https://www.jianshu.com/p/91227e99dfd7 多态: 多态是面相对象语言一个重要的特性,多态即让同一个用户自定义类型的对象在不同的...

yinfourever的专栏 635

S7-1200PLC与昆仑通态触摸屏以太网通信的具体方法和步骤(图文)

S7-1200PLC与昆仑通态触摸屏以太网通信的具体方法和步骤(图文)

Robot_PLC_HMI_Automation 1万+

C++学习记录

本文章用于记录作者个人的C++学习笔记

weixin_42720567的博客 712

OpenCV开发笔记(〇):使用mingw530_32编译openCV3.4.1源码,搭建Qt5.9.3的openCV开发环境

欢迎技术交流和帮助,提供IT相关服务,索要源码请联系博主QQ: 21497936,若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.youkuaiyun.com/qq21497936 本文章博客地址:https://blog.youkuaiyun.com/qq21497936/article/details/79641510 目录 OpenCV开发笔记(一):使用mingw530_32编译...

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 5万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

多态(Polymorphism)—— 面向对象编程的灵魂

摘要: C++多态是面向对象核心特性,指不同对象调用同一函数产生不同行为。实现多态需满足:通过基类指针/引用调用虚函数,且派生类重写该虚函数。虚函数表(vtable)是多态的关键机制,存储虚函数地址。抽象类含纯虚函数(=0),强制派生类重写。重写、重载与隐藏的区别在于作用域和函数签名。C++11引入override和final增强安全性。多态原理基于虚表指针动态绑定,实现运行时多态。

2303_77004089的博客 321

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

2024年最新C++知识黄金学习记录(1),快速从入门到精通

Person是父类,也称作基类。Student是子类,也称作派生类。class Student(派生类):public(继承方式)Person(基类)public:int major;//专业int stuid;//学生学号在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。通俗解释:多态按字面的意思就是多种形态。

2401_84973278的博客 1093

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

2024年C++知识黄金学习记录,2024年最新2024最新C C++中级面试题目汇总解答

在学习C++之前,我们先来回顾一下C与C++的区别:博主认为C和C++的主要区别在于:C是面向过程的语言,不支持类和对象;而C++是过程式和面向对象编程语言的结合,因此C++可以被称为混合语言。最开始的C++被称为C with classes,也就是带类的C,这也说明了C++早期设计出来的一个重要目的:支持面向对象。C++相比C语言,在面向对象编程上,支持直接声明类,支持声明和自动调用类的构造函数和析构函数,支持权限修饰符,支持类的继承派生等。

2401_84975223的博客 747

深入解析C++多态:从虚函数表到动态绑定原理与实践

多态是面向对象编程的核心概念之一,它允许程序在运行时根据对象的实际类型调用相应的方法,极大地提升了代码的灵活性和可扩展性。其实现原理主要依赖于虚函数表(vtable)和虚函数表指针(vptr),编译器通过这两个机制在运行时动态解析函数地址,从而实现动态绑定。这项技术的核心价值在于实现接口与实现的分离,支持设计模式如工厂方法和策略模式,是构建大型、可维护软件系统的基石。在C++中,多态广泛应用于框架设计、库开发和需要运行时行为变化的场景,例如GUI事件处理、插件系统等。理解虚函数表的内存布局、掌握动态绑定与静

weixin_30552811的博客 277

C++面向对象编程:从封装、继承到多态的实战指南

面向对象编程是一种主流的程序设计范式,其核心思想是将数据与操作数据的方法封装成对象,从而提升代码的模块化、安全性和可复用性。其基本原理在于通过类定义对象的蓝图,通过实例化创建具体对象,并通过访问控制实现封装。这一技术的核心价值在于它能有效管理复杂软件系统的状态与行为,降低耦合度,是构建大型、可维护应用程序的基石。其典型应用场景包括图形用户界面开发、游戏引擎设计、企业级业务系统以及如本文所演示的银行账户管理系统等。本文以C++为例,深入浅出地讲解了类与对象、封装、继承和多态这四大支柱,并通过一个完整的银行账户

weixin_30735745的博客 394

父类的正常成员函数子类可以使用,并不是继承下来 的,子类是怎么调用父类的函数 : 可能是利用了一种叫函数名联编的方法.没有隐藏的情况下用函数名字来决定调用的函数.

父类的正常成员函数子类可以使用,并不是继承下来 的,子类是怎么调用父类的函数 : 可能是利用了一种叫函数名联编的方法.没有隐藏的情况下用函数名字来决定调用的函数. 子类是怎样调用父类的函数的,带汇编解释 http://blog.youkuaiyun.com/hejinjing_tom_com/article/details/4165462 C++中的基类与派生类,看后半部分.

BIT少_CPP 2050

C++知识黄金学习记录,大数据开发高级架构进阶之数据传输与序列化

在学习C++之前,我们先来回顾一下C与C++的区别:博主认为C和C++的主要区别在于:C是面向过程的语言,不支持类和对象;而C++是过程式和面向对象编程语言的结合,因此C++可以被称为混合语言。最开始的C++被称为C with classes,也就是带类的C,这也说明了C++早期设计出来的一个重要目的:支持面向对象。C++相比C语言,在面向对象编程上,支持直接声明类,支持声明和自动调用类的构造函数和析构函数,支持权限修饰符,支持类的继承派生等。

2401_84166497的博客 905

多态及其内部原理剖析,java分布式锁的面试

金三银四到了,送上一个小福利!19583065)]金三银四到了,送上一个小福利![外链图片转存中…(img-obkxH4vN-1712019583067)][外链图片转存中…(img-RudFzmPd-1712019583068)][外链图片转存中…(img-aG5llmFs-1712019583068)]

2401_83977825的博客 631

C++守则——为多态基类声明virtual函数

我们都知道实现多态的一个方法就是使用虚函数。比方说我们用不同的方法记录时间: class TimerKeeper { public: TimeKeeper(); ~TimeKeeper(); ... }; class AtomicClock: public TimerKeeper {...}; //原子钟 class WaterClock: public TimerKeeper {...

qq_43419761的博客 302

代码复用的皇冠——继承和多态

在上述代码中我们可以看到每一个类中都存在一个myswap函数,这样的操作要是放在同一作用域下会因为重定义而编译报错,然而在基类和派生类之中,或者派生类和派生类中,可以重定义这样一个同名的成员,这样我们使用派生类中的同名函数时,就不会调用基类的同名函数了,(同名变量也是如此)也就是说派生类中基类部分的同名成员被隐藏了。

2501_94762791的博客 406

漫谈C++为什么不支持模板虚函数

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

weixin_34318326的博客 1345
上一篇: C++那些事--个人学习记录01
下一篇: 侯捷C++学习记录(截至参数传递与返回值)
Code_KY
博客等级 码龄5年 43粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值