浅谈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

继承与虚继承在内存上

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

SAP 运费处理方式 从直接的处理方式上看,情况1/2/3可以将运费记账到物料成本中,但情况4/5/6是直接记账到成本对象中,具体是要体现在损益表中,还是要结转到物料成本中,可依据业务要求进行好处理。如果体现在损益表中,不需要多过多额外的操作,如果要体现在物料成本中心,则需要再进行一系列的处理,最终将金额结转到物料成本中。因为在创建采购订单时不知道具体运费,可以不维护运费,只需要维护材料价格。:创建采购订单时,运费是由供应商承担,很多时候是包含在材料报价中,这种情况不需要专门针对运费进行处理,材料价格中已包含运费。 阅读详情

相关推荐

AXI VIP配置全指南:从报错到成功仿真的完整流程(Vivado 2023版)

本文详细解析了在Vivado 2023环境中配置AXI Verification IP(VIP)进行协议仿真的完整流程。针对常见的include和import报错问题,提供了具体的解决方案和代码示例,指导用户从IP核创建、参数化配置,到构建可工作的仿真测试平台,最终实现成功仿真。

gpt4scribbler的博客 233

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

qq_51050526的博客 663

AutoSAR配置视频讲解:简介

AutoSAR实验视频讲解:闪烁一颗LED实验【简介】 大家好,欢迎来到雪云飞星的《AutoSAR实验课的视频讲解》专栏。看过《AutoSAR入门到精通系列讲解》的朋友们应该对博主不陌生,有很多朋友加了博主的微信成为了好友,还有朋友约过线下见面,博主很高兴大家能从我的博客中获得一些收获。在专栏里博主挖了很多坑,当时也说过想要录制一个AutoSAR的配置视频教程,素材在20年初就已经录好,中间各种原因足足鸽了一年。当时因为一些技术原因只能通过博客的图文形式展示出来,现在我们剪辑了视频,请了专业的配音,希望以视

雪云飞星的博客 9653

子类虚函数调用无效

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

Vis_Stu的专栏 1886

OKX 欧易 交易机器人开发基础

接口文档: https://www.okx.com/docs-v5/zh/#overview REST API 常用请求 查看账户余额 结果数据格式: 获取限价 结果格式: 获取指数行情 数据结构: 下单 结果数据: 获取未成交订单列表 返回结果: 撤单 结果结构:

Willin Wang 的全栈升级指南 2万+

RH850从0搭建Autosar开发环境【2X】- Davinci Configurator之EcuC模块配置详解(上)

RH850从0搭建Autosar开发环境【2X】- Davinci Configurator之EcuC模块配置详解(上)

weixin_42412049的博客 1529

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

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

小洁洁 978

QQ也能连接OpenClaw啦!手机QQ远程操控本地AI保姆级教程

2026年最新OpenClaw与QQ连接教程发布,支持手机远程操控本地AI。腾讯官方推出QQ Bot插件,无需服务器即可实现三步绑定。教程提供三种连接方案:新手首选的扫码连接(10分钟搞定)、稳定的QQ群机器人方案,以及公网接入方案。详细步骤包括版本更新、插件安装、扫码绑定和功能测试,并附常见问题解决方案。该功能让用户通过QQ指令即可实现文件整理、文档生成等电脑操作,真正实现"手机发指令,电脑自动干"。

通俗易懂学IT 592

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

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

qq_36847067的博客 368

SAR合成孔径雷达成像及处理(附带Matlab源代码)

总结:本文介绍了SAR合成孔径雷达的基本原理,并提供了使用Matlab实现SAR成像和处理的源代码示例。然后,在慢时间域进行方位压缩处理,通过计算每个接收通道的延迟和频移,将多次接收的信号叠加得到最终的成像结果。SAR成像的基本原理是通过接收雷达发射的脉冲信号的回波,并利用多次接收的信号进行叠加处理。以多普勒频移校正为例,根据雷达飞行速度和方位角,计算实际的多普勒频率,并对每个接收通道的数据进行频移校正,以消除因目标运动引起的频率偏移。通过调整参数和算法,可以实现不同的SAR成像和处理效果。

ByteJolt的博客 689

深度解析长鑫G5 DRAM工艺的技术逻辑与微缩边界

长鑫存储G5 DRAM平台通过多重图形化、45:1高深宽比电容与外围HKMG技术,突破先进光刻受限瓶颈,在11.95 nm有源区半间距下实现阵列微缩与电容结构优化。其核心意义不在于对标国际节点,而在于系统性解决“尺寸缩小—电荷保持—外围跟进而”三大矛盾,展现国产DRAM在无EUV条件下推进先进制程的工艺整合能力。

硬核科技 36

虚函数的定义和使用

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

ahang的博客 1602

基于STM32L4XX、HAL库的AD7768BSTZ 模数转换器ADC驱动程序设计

/ 默认SPI配置。// 读取通道数据命令。// 通过SYNC_IN引脚触发转换(如果使用)// 处理数据...// 或者通过SPI命令。// 初始化AD7768。// SPI1引脚配置。

zhusl6688的博客 461

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

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

IT_Quanwudi的博客 9059

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

weixin_42650596的博客 1150

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

a45467911的博客 996

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值