浅谈C++虚函数、纯虚函数、虚继承

C++之继承,菱形继承,虚继承,虚函数,纯虚函数 继承,访问限定 概念:当一个类被其他的类继承时,被继承的类称为基类,又称父类;继承其他的类叫做派生类,又称子类。基类定义了所有派生类的共有属性,派生类在继承共有属性的同时,又增加了自己特有的属性。 注意:一个类可以有多个子类,一个子类也可以有多个父类,甚至子类也可以变为父类,被其他类进行继承。这就属于多继承。 作用:继承是为了复用。共享公有的东西,同时又可以实现自身独有的特征。 <继承方式... 阅读详情

关键字:virtual

虚函数

C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。
子类可以重写父类的虚函数实现子类的特殊化。

纯虚函数

C++中包含纯虚函数的类,被称为是“抽象类”。不允许实例化,就是不允许定义对象(不能Father f)),也不能作为函数参数,*只能怪通过指针(Father f)

子类必须实现父类的纯虚函数,否则自己也是抽象类,子类必须重写父类的虚函数 ,只有实现了这个纯虚函数的子类才能实例化。

C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。

C++中的纯虚函数也是一种“运行时多态”。

class Father{
	virtual void out1(string s)=0;
}

class Child :public Father{
	void out1()
    {
        cout<<"B(out1)"<<endl;
    }
}

......

int main(){
	Father *f = new Child;//使用父类创建了子类的对象,此时父类的析构函数必须定义为虚函数,原因下篇分析
}

说明

要说明的是,父类定义了虚函数之后就会自动生成虚函数指针,指向虚表。
子类继承后并重写虚函数后,会在虚表添加该虚函数新的实现,但是指针依然是父类指针。
因此在计算sizeof() 时候,看到虚函数应当当做指针大小计算即可。

虚继承

虚继承是为了解决多重继承中的问题而出现的
从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题

虚继承时内存大小计算

class A
{
    char k[3];
public:
    virtual void aa()
    {

    };
};
class B:public  A
{
    char j[3];
public:
    virtual void bb()
    {
        
    };
};
class C:public  B
{
    char i[3];
public:
    virtual void cc()
    {
        
    };
};
int main()
{
    cout<<sizeof(A)<<endl;
    cout<<sizeof(B)<<endl;
    cout<<sizeof(C)<<endl;  
    return 0;
}

普通继承 8 12 16
A对齐规则加虚函数指针 4+4
B继承过来的变量4+自己的变量4+自己的虚函数指针4
C继承过来的变量8+自己的变量4+自己的虚函数指针4

class A
{
    char k[3];
public:
    virtual void aa()
    {

    };
};
class B:public virtual A
{
    char j[3];
public:
    virtual void bb()
    {
        
    };
};
class C:public virtual B
{
    char i[3];
public:
    virtual void cc()
    {
        
    };
};
int main()
{    
    cout<<sizeof(A)<<endl;    
    cout<<sizeof(B)<<endl;
    cout<<sizeof(C)<<endl;    
    return 0;
}

虚继承情况下:8 20 32
A依然是4+4
B自己的变量4+自己的虚函数指针4+指向父类的虚函数指针4+从父类继承过来的所有内容8
C自己的变量4+自己的虚函数指针4+指向父类的虚函数指针4+从父类继承过来的内容20

继承与虚继承在内存上

子类继承父类之后,子类内容大小上只能得到父类的变量,不能得到父类的虚函数指针
子类虚继承父类之后,会生成一个指向父类的虚函数指针,同时得到父类的所有内容,包括虚函数

利用RFIDIOt和NFC进行Hitag2密码暴力破解: Python代码实现 RFID即无线射频识别,是一种通信技术,可以通过无线电信号读取、捕获和保存终端上的信息。这项技术在物流、零售、医疗等领域有着广泛的应用。NFC即近场通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输。Hitag2是一种常见的RFID标签,广泛应用于汽车防盗系统、门禁系统等。由于其安全性在过去被广泛认可,很多设备都采用了这种标签。但近年来随着密码破解技术的发展,Hitag2的安全性受到了一些挑战。 阅读详情

相关推荐

低速信号设计之 ESPI 篇

ESPI 是 Intel 推出的增强型串行外设接口,基于 SPI 发展而来,新增 Reset# 和 Alert# 信号,采用点对点主从通信模型,最高速率达 33MHz,支持半双工与 DMA 传输。 其物理接口含 10 条线路,通信协议分物理层、数据链路层等四层。布局布线需关注信号完整性、电源完整性,还得考虑与 SPI 的兼容性。 ESPI 广泛应用于计算机系统(连接 BIOS、电源管理器等)和工业控制领域,具有引脚少、功耗低等优势,但设计复杂且存在兼容性挑战。

qq_16237389的博客 1380

c++,子类继承抽象类没有实现抽象方法(纯虚函数)无法实例化

qq_51050526的博客 663

随机截距交叉滞后模型RI-CLPM:原理、Mplus实现与结果解读

纵向面板数据分析中,传统交叉滞后模型(CLPM)常被用于探索变量间的时序关系,但其估计结果可能混淆了个体间稳定差异与个体内短期波动,导致交叉滞后路径出现偏差。随机截距交叉滞后模型(RI-CLPM)通过引入随机截距因子,将个体特质层面的差异与个体内动态过程分离,从而提供更纯净的个体内效应估计。该模型在组织心理学、发展心理学、成瘾行为等研究领域迅速普及,并成为顶级期刊审稿时常见的稳健性检验要求。本文从原理出发,系统讲解RI-CLPM的模型构建、识别条件、Mplus实操代码、输出解读及常见陷阱,并结合协变量处理、

weixin_33525298的博客 273

子类虚函数调用无效

这种情况出现的比较少,从工作到现在将近一年时间就遇到两次。 主要表现为子类重载了父类的虚函数后,使用正常方法(即父类指针指向子类对象后调用该虚函数),结果调用的仍为父类的函数。 一开始以为是指针指向有问题,或者虚函数的声明名称写错了这种小问题,但是检查后都是正确的。 更详细的情况:基于cad的二次开发,实际上述的子类是某个继承于AcDbEntity类的自定义构件,在cad打开情况下,绘制一个

Vis_Stu的专栏 1886

VUE3如何使得大屏自适应的几种方法?

16:9。

weixin_42711805的博客 1万+

代数拓扑与AI架构:AI应用架构师深入探索数学研究如何分析复杂系统的结构特性

随着人工智能技术的飞速发展,AI系统变得越来越复杂。AI应用架构师需要有效的工具和方法来理解、设计和优化这些复杂系统。代数拓扑作为数学的一个分支,提供了独特的视角和技术来分析复杂系统的结构特性。本文旨在帮助AI应用架构师深入了解代数拓扑,以及如何将其应用于AI架构设计中,提升对复杂系统的分析能力。首先,我们会介绍代数拓扑和AI架构相关的核心概念及其联系,通过有趣的故事引入主题,让读者轻松理解复杂概念。接着,深入探讨代数拓扑的核心算法原理,结合具体的编程语言代码示例详细阐述。

大模型应用工坊 670

深入解析C++中的虚函数和虚继承:实现多态性与继承关系的高级特性

虚函数是在C++中用于实现多态性的一种特殊函数。它通过使用关键字"virtual"进行声明,在基类中定义,可在派生类中进行重写。虚函数允许在运行时根据对象的实际类型来调用相应的函数,而不仅仅根据指针或引用的类型。这使得在继承关系中,通过基类指针或引用调用虚函数时,可以根据实际对象的类型来动态地确定要执行的函数版本,实现多态性的特性。

小洁洁 978

广州吉欧电子科技有限公司安卓开发工程师岗位 - 技术核心、职责详解与面试指南

广州吉欧电子科技有限公司招聘安卓开发工程师,该岗位可接收优秀应届生。岗位职责包括:1)负责安卓应用架构设计与开发,确保稳定性和可扩展性;2)功能模块编码实现与测试;3)性能优化与用户体验提升;4)后端接口对接;5)系统版本适配;6)用户反馈处理迭代;7)特殊要求熟悉RTK高精度定位技术原理及使用。该岗位要求扎实的安卓开发技术、良好的架构设计能力、性能优化经验,以及特定领域的RTK专业知识,是一个技术全面且具有专业特色的开发岗位。

郑伟强dev的专栏 153

C++的多态、虚函数、虚继承

1、C++多态 多态,从字面意思上来说就是同一个事物的多种形态。而在C++里面,多态分为静态多态和动态多态。静态多态主要的实现有函数的重载和模板,主要特点是在编译阶段,就能确定具体要调用的函数。动态多态主要是通过虚函数实现,它有个特点就是只有在运行阶段,才能确定具体的调用。 这里主要讲下动态多态。动态多态有两个条件,第一个是基类中必须有虚函数,而且子类必须对父类的虚函数进行重写。第二个条件是通过父...

qq_36847067的博客 368

ACS运动控制器编程语言

ACS运动控制器采用SPiiPlusLanguage(SPL)作为核心编程语言,该语言基于C语法设计,内置丰富的运动控制指令,支持点位运动、插补等复杂控制。控制器提供专用开发工具SPiiPlusManager和ACSStudio,支持图形化编程与调试。同时兼容TCP/IP、EtherCAT等多种扩展接口,便于与上位机或PLC集成。使用时需注意实时性优先级、轴参数匹配等关键事项。官方文档和示例程序为开发者提供了完善的学习资源。

StevenChen的博客 617

揭秘AI人工智能中Stable Diffusion的模型微调技巧

Stable Diffusion作为一种强大的文本到图像生成模型,在艺术创作、设计、娱乐等多个领域展现出了巨大的应用潜力。然而,其默认的模型输出可能无法满足特定用户或特定场景的个性化需求。本文章的目的在于深入揭秘Stable Diffusion的模型微调技巧,让读者能够根据自己的需求对模型进行定制化调整,生成符合特定风格、主题或要求的图像。范围涵盖了从基础概念到实际操作,从理论原理到项目实战的全方位内容,旨在为读者提供一个系统且深入的学习指南。

大模型应用工坊 948

虚函数的定义和使用

虚函数怎么使用,什么是虚函数,什么是纯虚函数

ahang的博客 1602

MAC-电脑中的user文件夹在哪?

MAC-电脑中的user文件夹在哪?

兴趣是最好的老师 1万+

C++继承和多态(虚函数、纯虚函数、虚继承)

C++继承和多态(虚函数、纯虚函数、虚继承) 一:继承 继承的概念:为了代码的复用,保留基类的原始结构,并添加派生类的新成员。 继承的本质:代码复用 我们用下图解释下: 那么我们这里就可以提出几个问题了: ①:进程的方式有哪些呢? 这里有三种继承方式: public:任意位置可以访问 protected:只允许本类类中以及子类类中访问 private:只允许...

IT_Quanwudi的博客 9059

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

计算机控制技术及应用

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

虚函数、纯虚函数和虚继承

抽象类被继承后,子类可以继续是抽象类,也可以是普通类,而虚基类,是含有纯虚函数的类,它如果被继承,那么子类就必须实现虚基类里面的所有纯虚函数,其子类不能是抽象类。实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,纯虚函数是一种特殊的虚函数,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象。虚函数、纯虚函数的联系。

weixin_42650596的博客 1150

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++语法——多态,虚函数,纯虚函数,虚函数表,虚继承

包含纯虚函数的类称为抽象类(Abstract Class)。抽象类仅仅提供了一些接口,但是没有实现具体的功能。作用就是制定各种接口,通过派生类来实现不同的功能,从而实现代码的复用和可扩展性。

a45467911的博客 996

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++虚继承虚基类虚函数纯虚函数总结

对于这些虚的,之前有很多歧义和不解,现在进行一下学习总结吧! 1.多重继承可能会导致二义性,而虚继承可以解决这个问题。虚继承是一种机制,类通过虚继承指出它希望共享其虚基类的状态,在虚继承下给定虚基类无论该类在派生层次中作为虚基类出现几次,只继承一个共享的基类的对象。共享的虚基类子对象就是虚基类。 例如: class istream:public virtual ios{}; class

u011700461的博客 2860

虚函数、纯虚函数、虚继承——virtual关键字的小例子

文章目录虚函数纯虚函数虚继承 虚函数 虚函数是C++的运行时多态,可以在基类中将被重写的成员函数设置为虚函数。 虚函数的作用是:当通过基类的指针或引用调用该成员函数时,将根据指针指向的对象类型确定调用的函数,而非指针的类型。 例子如下所示: 我们定义一个基类Shape,令Rectangle类继承自Shape。 我们写两个函数:outputType和outputTypeWithoutVirtual,在子类中对其进行重写。 在测试类中,我们创建一个Rectangle对象,然后使用Shape指针获取Rectan

weixin_43399489的博客 1256

【面试八股总结】面向对象三大特性、虚函数、纯虚函数、虚继承

面向对象三大特性、虚函数、纯虚函数、虚继承

Chesnut. 1227

C++ 虚函数 虚继承 纯虚函数 之 一二三

虚函数是为了实现多态性:允许使用统一的接口去访问不同子类的函数。class A { public: A(){} virtual void print() { cout<<"I am A"<<endl; } }; class B:public A { public:

水滴石穿 2894

C++中虚函数与虚继承区别浅析笔记

虚继承和虚函数是完全无相关的两个概念。 虚函数:是在函数声明/定义时,必须加上virtual关键字。作用就是让其派生类能够覆盖此函数,从而实现多态(运行时多态)。 补充:编译时多态性:通过重载函数和运算符重载实现。运行时多态性:通过虚函数和继承实现。 还有一点就是在派生类中,继承基类同名的虚函数后,不管派生类中显示写不写virtual,此函数依然是虚函数。 还有一种纯虚函数。纯虚函数在基类...

qq_40324647的博客 1264

C++的虚函数、虚继承、抽象类

特征1特征2特征3用途虚函数父类成员函数被声明virtual所有子类同名函数自动成为virtual动态绑定:通过基类指针或引用来访问基类和派生类中的同名函数。(指针指哪打哪)父类指针调用子类成员虚继承把基类声明称virtual多个基类派生子类并且多个基类又派生于共同基类(爷类)创建子类对象时,存在多次构建爷爷类的情况解决了多个父类派生子类的时候同一个爷爷类时,在派生子类时使其只存在一个爷爷类。抽象类类域里包含纯虚函数(类域可以是基类也可以子类,通常基类)

wenchm的博客 2101

C++ 多态、虚析构、模板类、常函数、虚继承、虚函数和纯虚函数相关知识和问题总结

常函数const成员函数)是在函数声明时,在函数名之后添加const关键字,表明该函数不会修改对象的任何成员变量。常函数的示例private:int value;public:int getValue() const { // 常函数value = v;// 非常函数,可以修改成员变量作用常函数的主要作用是保证对象的状态不会在函数中被改变,尤其是在使用const对象时。如果一个对象是常量(const),则只能调用常函数,无法调用非常函数。

qq_50373827的博客 1590

C++中的各种“虚“-- 虚函数、纯虚函数、虚继承、虚基类、虚析构、纯虚析构、抽象类讲解

C++中的一些重要概念都与“虚”相关,比如: ① 虚基类、虚继承、虚基类指针(vbptr)、虚基类表(vbtable); ② 虚函数、纯虚函数、虚函数指针(vfptr)、虚函数表(vftable)、抽象类、虚析构、纯虚析构。 这里对上面罗列出的概念做一个总结,争取把这些都一次讲清楚:......

weixin_47826078的博客 1720

虚函数继承、虚继承、虚析构函数、纯虚函数

1、什么是虚函数继承?

zhliu1991的专栏 1076

虚函数,纯虚函数以及虚继承

虚函数是C++用于实现多态机制。如果父类不用virtual进行声明,则父类调用子类对象方法的时候仍然是父类方法。我们也可以在子类覆盖父类方法后面添加override检测。并且派生类通过指针或者引用指向派生类函数,则表现为派生类的特征。 例如: class Parent { public: virtual void f() { printf("ca...

JeneaXiao1995的博客 207
上一篇: 对象的复制和赋值有什么区别?各自的应用场景是怎么样的?
下一篇: 什么情况下析构函数必须定义为虚函数
Rany010
博客等级 码龄9年 5粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值