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

C++ ---- 虚继承

一、什么是虚继承

        虚继承就是子类中只有一份间接父类的数据。用于解决多继承中的父类为非虚继承时出现的二义性问题,即菱形继承问题。继承方式需要加上virtual关键字。

二、虚继承的特性

以菱形继承为例:

1.不使用虚继承

根据输出的大小和关系图,可以看出student和employee继承的是同一个person,但是在结构中有两个person,造成了二义性。

class Person {
private:int _pid;char _sex;
};class Student :public Person {
private:int _sid;
};class Employee :public Person {
private:int _eid;
};class EStudent :public Student, public Employee {
private: int _egid;
};
int main() {cout << sizeof(Person) << endl;cout << sizeof(Student) << endl;cout << sizeof(Employee) << endl;cout << sizeof(EStudent) << endl;}

2.使用虚继承

使用虚继承之后,就可以看出student和employee继承的是同一个person,并且不会导致二义性

class Person {
private:int _pid;char _sex;
};class Student :virtual public Person {
private:int _sid;
};class Employee :virtual public Person {
private:int _eid;
};class EStudent :public Student,public Employee {
private: int _egid;
};

三、虚继承原理

在上述实例中,我们发现父类数据并不存放在虚继承的子类中,那么子类怎么找到父类数据呢?

原因是在虚继承的类中,会定义一个虚基表指针vbptr指向虚基表。而虚基表中会存在偏移量,这个量就是表的地址到父类数据地址的距离。当一个类虚继承自另一个类时,子类对象中会包含一个虚基类指针(vbptr)。这个指针指向一个虚基类表(vbtable)。虚基类表中存储了虚基类子对象相对于子类对象的偏移量等信息。通过虚基类指针找到虚基类表,再根据表中的偏移量信息,就可以在子类对象的内存空间中定位到虚基类(父类)的数据成员。

四、虚函数与虚继承

虚函数和虚继承并不是一个概念:

  • 虚函数:是在基类中使用virtual关键字声明的成员函数,它允许在派生类中被重新定义(重写),以实现不同的行为。
  • 虚继承:是一种继承方式,用于解决多继承中可能出现的菱形继承问题,确保从多个基类继承而来的同一个基类子对象在派生类中只有一份拷贝。

原理:

  • 虚函数:通过虚函数表(vtable)和虚函数表指针(vptr)来实现。每个包含虚函数的类都有一个虚函数表,其中存储了该类所有虚函数的地址。对象中包含一个虚函数表指针,指向所属类的虚函数表,以便在运行时能够动态地查找和调用正确的虚函数。
  • 虚继承:编译器会为虚继承的基类子对象创建一个隐藏的指针,称为虚基表指针(vbptr),它指向一个虚基表(vbtable)。虚基表中存储了虚基类子对象相对于派生类对象的偏移量等信息,通过这些信息可以在运行时正确地访问虚基类子对象。

我们再来说一下虚函数表的存储方式:

虚函数表在编译时产生,存放在只读数据段(每一个类的虚表不可更改),每一个类对应一个虚表,而每一个类的所有对象共享同一个虚表。

虚函数表的存储方式是一个指针数组,它本质上是一个数组,而每一个数组元素都是一个指针,指向对应的虚函数地址。

当通过对象指针或引用调用虚函数时,程序会先通过对象内的虚表指针找到虚表,再从虚表中获取对应虚函数的指针,进而调用该函数,以此实现运行时多态。

五、构造函数和析构函数是否可以写为虚继承

1.构造函数

构造函数的用途:1)创建对象;2)初始化对象中的属性;3)类型转换;4)在定义对象时构造函数设置虚表指针指向虚函数表

2.析构函数

析构函数是类的一个特殊的成员函数:

  • 当一个对象的生命周期结束时,系统会自动调用析构函数注销该对象并进行善后工作,对象自身也可以调用析构函数;
  • 析构函数的善后工作是:释放对象在生命周期内获得的资源(如动态分配的内存,内核资源);
  • 析构函数也用来执行对象即将被撤销之前的任何操作

根据赋值兼容规则,可以用基类的指针指向派生类对象,如果使用基类型指针指向动态创建的派生类对象,由该基类指针撤销派生类对象,则必须将析构函数定义为虚函数,实现多态性,自动调用派生类析构函数,否则可能存在内存泄漏问题

类中没有虚函数,就不要把析构函数定义为虚。

        

相关文章:

C++ ---- 虚继承

一、什么是虚继承 虚继承就是子类中只有一份间接父类的数据。用于解决多继承中的父类为非虚继承时出现的二义性问题&#xff0c;即菱形继承问题。继承方式需要加上virtual关键字。 二、虚继承的特性 以菱形继承为例&#xff1a; 1.不使用虚继承 根据输出的大小和关系图&…...

COMSOL多层圆片随机堆积三维模型

构建多层圆片随机堆积三维模型可用于材料、化工、土木、生物医学等多领域的研究&#xff0c;如复合材料设计、催化剂载体、颗粒物堆积研究等。本案例介绍在COMSOL内建立三维圆片堆积模型。 三维圆片堆积模型可采用CAD纤维密堆积3D插件建立&#xff0c;参数设置如图所示&#…...

PHP 开发API接口签名验证

就安全来说&#xff0c;所有客户端和服务器端的通信内容应该都要通过加密通道(HTTPS)传输&#xff0c;明文的HTTP通道将会是man-in-the- middle及其各种变种攻击的温床。所谓man-in-the-middle攻击简单讲就是指恶意的黑客可以在客户端和服务器端的明文通信通道上做手 脚&#x…...

Web开发-JavaEE应用ORM框架SQL预编译JDBCMyBatisHibernateMaven

知识点&#xff1a; 0、安全开发-JavaEE-构建工具-Maven 1、安全开发-JavaEE-ORM框架-JDBC 2、安全开发-JavaEE-ORM框架-Mybatis 3、安全开发-JavaEE-ORM框架-Hibernate 4、安全开发-JavaEE-ORM框架-SQL注入&预编译 一、演示案例-WEB开发-JavaEE-构建工具-Maven IDEA配置m…...

软考-数据库系统工程师第四版pdf

软考-数据库系统工程师第四版pdf git中的文件相对没有那么清楚&#xff0c;网盘的有高清版 github下载 这里我给出仓库地址 链接: https://github.com/yaodada123/ruankao-pdf https://github.com/yaodada123/ruankao-pdf gitee下载 https://gitee.com/yao-hengchao/ruank…...

扫描仪+文档pdf编辑器+pdf格式转换器

小扫描仪是一款集“扫描仪文档pdf编辑器pdf格式转换器”于一体的多功能扫描软件&#xff0c;软件功能丰富&#xff0c;而且目前是免费&#xff0c;功能包括扫描、编辑、转换三部分。 扫描&#xff1a;扫描的功能包括文档扫描、身份证扫描、护照扫描、书籍扫描、OCR和二维码。 扫…...

【stm32--HAL库DMA+USART+空闲中断不定长收发数据】

串口通信-Hal库实现不定长度收发&#xff0c;DMAUSART DMA串口STM32CUBEMX配置&#xff08;工程创建&#xff09;基础配置时钟配置工程配置 代码编写现象 DMA 在正式配置之前&#xff0c;我们先来一起简单了解一下DMA。DMA&#xff08;Direct Memory Access&#xff0c;直接内…...

5G-A技术

最近的iOS 18.4 推送了 新功能&#xff0c;最引人注目的便是这个5G-A的这个功能&#xff0c;那什么是5G-A呢 &#xff1f; 目前北京 四环内 还是有能显示出5G-A标志的。 5G-A &#x1f310; 一句话概括&#xff1a; 5G-A 更快的速度 更低的延迟 更强的AI能力 更智能的网…...

Vue 组件 - 动态组件

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 组件 - 动态组件 目录 动态组件 选项卡页面示例 更简单写法 增加输入框 弥补措施 总结 动态组件 选项卡页面示例 功能&#xff1a;选项卡功能&#xff0c;设置导航点击哪个显示相应页面。 设置三个全局组件&#…...

ffmpeg滤镜使用

ffmpeg实现画中画效果 FFmpeg中&#xff0c;可以通过overlay将多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中&#xff0c;生成画中画的效果 FFmpeg 滤镜 overlay 基本参数 x和y x坐标和Y坐标 eof action 遇到 eof表示时的处理方式&#xff0c;默认为重复。…...

【MVC简介-产生原因、演变历史、核心思想、组成部分、使用场景】

MVC简介 产生原因&#xff1a; MVC&#xff08;Model-View-Controller&#xff09;模式诞生于20世纪70年代&#xff0c;由Trygve Reenskaug在施乐帕克研究中心&#xff08;Xerox PARC&#xff09;为Smalltalk语言设计&#xff0c;目的是解决图形用户界面&#xff08;GUI&…...

基于大模型的房间隔缺损手术全流程预测与方案优化研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与目标 1.3 研究方法与创新点 二、房间隔缺损概述 2.1 房间隔缺损定义与分类 2.2 发病机制与病理生理 2.3 流行病学特征 三、大模型在房间隔缺损预测中的应用原理 3.1 大模型技术简介 3.2 数据收集与预处理 3.3 模型…...

什么是 CSSD?

文章目录 一、什么是 CSSD&#xff1f;CSSD 的职责 二、CSSD 是如何工作的&#xff1f;三、CSSD 为什么会重启节点&#xff1f;情况一&#xff1a;网络和存储都断联&#xff08;失联&#xff09;情况二&#xff1a;收到其他节点对自己的踢出通知&#xff08;外部 fencing&#…...

uniapp APP端在线升级(简版)

设计思路&#xff1a; 1.版本比较&#xff1a;应用程序检查其当前版本与远程服务器上可用的最新版本 2. 更新状态指示&#xff1a;如果应用程序是不是最新的版本&#xff0c;则页面提示下载最新版本。 3.下载启动&#xff1a;通过plus.downloader.createDownload()启动新应用…...

2024年蓝桥杯Java B组省赛真题超详解析-分布式队列

问题&#xff1a;你需要回答在某个时刻&#xff0c;队列中有多少个元素具有可见性 方案&#xff1a;跟踪每个副节点已经同步到主节点队列的元素数量&#xff0c;并找出所有副节点中同步到的最少元素数量&#xff0c;这个数量即为所有副节点都已经同步的元素数量。 解析&#…...

Vue3入门

环境准备: node.js vscode or webstorm 哪个熟悉用哪个 这两个都是傻瓜式安装 浏览器直接搜索 下载即可 安装: 安装完node.js之后 按住快捷键 winR 打开命令提示符输入node 将显示版本信息 接着我们通过 vite 构建vue3工程 优点: 轻量快速的热重载&#xff08;HMR&#xf…...

向量库(Vector Database)概述

向量库&#xff08;Vector Database&#xff09;概述 1. 核心概念 ​向量 高维空间中的数值数组&#xff0c;通常由模型&#xff08;如BERT、ResNet&#xff09;将非结构化数据&#xff08;文本、图像等&#xff09;转换为嵌入向量。 ​向量相似性 衡量方法&#xff1a;余弦相…...

Oracle迁移达梦遇中断?试试SQLark的断点续迁功能!

在企业级数据迁移项目中&#xff0c;如果迁移单表数据量超过亿行、占用空间超过100GB时&#xff0c;一旦遇到网络中断或迁移报错&#xff0c;往往需要整表重新迁移&#xff0c;导致效率低下&#xff0c;严重影响项目进度。针对这一痛点&#xff0c;SQLark 支持对 Oracle→DM 的…...

上海某海外视频平台Android高级工程师视频一面

问的问题比较细&#xff0c;有很多小细节在里面&#xff0c;平时真不一定会注意到&#xff0c;做一个备忘&#xff1a; 1.Object类里面有哪些方法&#xff1f; Object 类是 Java 中所有类的根类&#xff0c;它定义了一些基本方法&#xff0c;供所有类继承和重写1. 常用方法 1…...

基于yolov11的汽车损伤检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv11的汽车损伤检测系统是一种先进的计算机视觉技术&#xff0c;旨在快速准确地识别汽车的各种损伤类型。该系统利用YOLOv11模型的强大性能&#xff0c;实现了对车辆损伤的精确检测与分类。 该系统能够识别的损伤类型包括裂纹&#xff08;crack&#xff…...

华为IP(3)

DHCP Relay报文格式 DHCP Relay主要负责转发DHCP客户端与DHCP服务器之间的DHCP报文&#xff0c;所以DHCP Relay的报文格式只是把DHCP的报文部分字段做了相应的修改&#xff0c;报文格式没有发生变化 hops&#xff1a;表示当前DHCP报文经过DHCP中继的数目&#xff0c;该字段由…...

面试问题总结:qt工程师/c++工程师

C 语言相关问题答案 面试问题总结&#xff1a;qt工程师/c工程师 C 语言相关问题答案 目录基础语法与特性内存管理预处理与编译 C 相关问题答案面向对象编程模板与泛型编程STL 标准模板库 Qt 相关问题答案Qt 基础与信号槽机制Qt 界面设计与布局管理Qt 多线程与并发编程 目录 基础…...

【TS学习】(15)分布式条件特性

在 TypeScript 中&#xff0c;分布式条件类型&#xff08;Distributive Conditional Types&#xff09; 是一种特殊的行为&#xff0c;发生在条件类型作用于裸类型参数&#xff08;Naked Type Parameter&#xff09; 时。这种特性使得条件类型可以“分布”到联合类型的每个成员…...

四款高效数据报表工具 让数据分析更简单

概述 在数字化时代&#xff0c;企业和组织越来越依赖数据驱动决策&#xff0c;报表软件成为提高数据可视化能力、优化业务管理的关键工具。本文将为大家介绍四款功能强大的报表软件&#xff0c;帮助不同需求的企业找到合适的解决方案。 一、山海鲸报表 山海鲸报表是一款零代…...

QT 非空指针 软件奔溃

在用QT的实际项目中&#xff0c;出现如下现象&#xff1a; 运行软件再关闭软件&#xff0c;然后再运行软件会崩溃。等待5~10分钟&#xff0c;再运行软件&#xff0c;又正常&#xff0c;百思不得其解&#xff0c;后面找到原因是在头文件里定义指针变量时没有赋初nullptr&#x…...

图漾相机——C#语言属性设置

文章目录 前言1.示例程序说明2.SDK API功能介绍2.1 ListDevice2.2 Open2.3 OpenDeviceByIP2.4 Close2.5 DeviceStreamEnable2.6 DeviceStreamFormatDump2.7 DeviceStreamFormatConfig2.8 DeviceReadCurrentEnumData2.9 DeviceReadCalibData2.10 DeviceStreamOn2.11 DeviceStrea…...

WPF中viewmodel单例模式

1、单例模式介绍 单例模式是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。它常用于需要全局唯一访问点的场景&#xff0c;如配置管理、日志记录、数据库连接等。 2、WPF 中 ViewModel 的单例实现 在 WPF 中&#…...

AI比人脑更强,因为被植入思维模型【36】时光机理论思维

giszz的理解&#xff1a;据说是软银孙正义提出的一种思维模型&#xff0c;他利用同一时间内的地区差&#xff0c;通过引入技术、思维&#xff0c;在同一地区&#xff0c;形成了时间差。所谓商业模式&#xff0c;有时就是打空间差、时间差&#xff0c;信息差。 一、定义 时光机…...

SQL Server:用户权限

创建 & 删除 1. 创建用户命令整理 创建 admin2 用户 -- 在 master 数据库创建登录名 USE master; BEGINCREATE LOGIN [admin2] WITH PASSWORDNCljslrl0620!, DEFAULT_DATABASE[master], CHECK_EXPIRATIONOFF, CHECK_POLICYON; END;-- 在 db03 数据库创建用户并添加到相应…...

Qt之QTextEdit控制文本滚动, 停止滚动, 开始滚动, 鼠标控制滚动

对工作台文本框进行控制。含以下内容。详细说明在源码中可查看 至最底部停止滚动开始滚动 源码分两部分. .h文件和.cpp文件 MyTextEdit.h #ifndef MYTEXTEDIT_H #define MYTEXTEDIT_H#include <QObject> #include <QTextEdit> #include <QScrollBar> #includ…...

策略模式与元数据映射模式融合 JSR 380 验证规范实现枚举范围校验

类文件 Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE,ElementType.CONSTRUCTOR,ElementType.PARAMETER,ElementType.TYPE_USE }) Retention(RetentionPolicy.RUNTIME) Documented Constraint(validatedBy {InEnumValidator.class, InEnumColle…...

9对象树(3)

目录 创建自定义的类&#xff0c;最主要的目的,是自定义一个析构函数,在析构函数中,完成打印.方便咱们看到最终的自动销毁对象的效果!!! 写完一个函数的声名之后, 按下 altenter, 在按下enter就可以自动的在对应的 cpp 文件中添加函数的定义了 内置类型&#xff0c;析构不会明…...

深入 OpenPDF:高级 PDF 生成与操作技巧

1 引言 1.1 项目背景 在许多企业级应用中,生成和操作 PDF 文档是一个常见的需求。PDF(Portable Document Format)因其格式统一、易于打印和分发而被广泛使用。本文将介绍如何使用 OpenPDF 库在 Java 项目中生成和操作 PDF 文档。 1.2 技术选型理由 OpenPDF:OpenPDF 是一…...

电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法

调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中&#xff0c;合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一&#xff1a;使用快捷键 大多数笔…...

Navicat导出mysql数据库表结构说明到excel、word,单表导出方式记录

目前只找到一张一张表导出的方式 使用information_schema传入表名查询 字段名根据需要自行删减&#xff0c;一般保留序号、字段名、类型、说明就行 SELECT COLUMNS.ORDINAL_POSITION AS 序号, COLUMNS.COLUMN_NAME AS 字段名, COLUMNS.COLUMN_TYPE AS 类型(长度), COLUMNS.N…...

【C++笔记】C++常见二叉树OJ和拓扑排序

【C笔记】C常见二叉树OJ和拓扑排序 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】C常见二叉树OJ和拓扑排序前言一.二叉树OJ1.1 根据二叉树创建字符串1.2 二叉树的层序遍历1.3 二叉树的最近公共祖先1.4 将二叉搜索…...

ARM-----数据处理、异常处理、模式切换

实列一&#xff1a; 1. 异常向量表 area reset, code, readonly code32 entry area reset, code, readonly&#xff1a;定义一个名为reset的代码区域&#xff0c;只读。 code32&#xff1a;指示编译器生成32位ARM指令。 entry&#xff1a;标记程序的入口点。 2. 程序入口…...

mapbox基础,使用geojson加载line线图层,实现铁路黑白间隔效果

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️line线图层样式二、🍀使用geojson加载…...

Python FastAPI + Celery + RabbitMQ 分布式图片水印处理系统

FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理 首先创建项目结构&#xff1a; c:\Users\Administrator\Desktop\meitu\ ├── app/ │ ├── __init__.py │ ├── main.py │ ├── celery_app.py │ ├── tasks.py │ └── config.py…...

阶段项目:Windows 服务器的组建与管理

项目概述 公司简介 创鑫公司是一家新成立的小型 IT 公司 公司决定组建部署一个小型的企业网络 员工人数不到20人 使用一台独立的 Windows 服务器提供各种网络服务 网络拓扑 设计需求 权限部分 权限部分要求 公司的网络管理员对办公计算机和服务器分别进行独立管理&#xff…...

【408】26考研-王道计算机408

王道408考研全套视频资料&#xff1a; 讲义01.26考研王道计算机【C语言督学营】02.【408领学班】26考研王道计算机B站独家03.26考研王道计算机【组成原理领学班】04.26王道计算机【计算机网络领学班】05.26考研王道计算机【数据结构领学班】06.26王道计算机【操作系统领学班】…...

数据分析问题思考路径

一、思考问题 1. 确认问题 因为背景: 因为5月1日的营业额突然下滑了10%,而历史从未出现过类似的跌幅 我想目的: 我想知道本次下滑的原因以此避免再出现这样的异常情况 现在思路: 现在能想到是原因是节假日和产品环节转化异常 最后感谢: 想请你帮我取数分析一下&#xff0c…...

vue省市区懒加载,用el-cascader 新增和回显

el-cascader对于懒加载有支持方法&#xff0c;小难点在于回显的时候&#xff0c;由于懒加载第一次只有一层&#xff0c;所以要根据选中id数组一层层的加载。 子组件 <template><el-cascaderref"cascaderRef"v-model"selectedValue":props"…...

从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.3.3领域适配案例:医疗文本分类与法律合同生成

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 从零构建大语言模型全栈开发指南-第三部分:训练与优化技术-3.3.3 领域适配案例:医疗文本分类与法律合同生成1. 领域适配的核心挑战与解决方案2. 医疗文本分类:从通用到专业的跃迁2.1 医疗领域适配的技…...

Web网页内嵌 Adobe Pdf Reader 谷歌Chrome在线预览编辑PDF文档

随着数字化办公的普及&#xff0c;PDF文档已成为信息处理的核心载体&#xff0c;虽然桌面端有很多软件可以实现预览编辑PDF文档&#xff0c;而在线在线预览编辑PDF也日益成为一个难题。 作为网页内嵌本地程序的佼佼者——猿大师中间件&#xff0c;之前发布的猿大师办公助手&am…...

Python WebSockets 库详解:从基础到实战

1. 引言 WebSocket 是一种全双工、持久化的网络通信协议&#xff0c;适用于需要低延迟的应用&#xff0c;如实时聊天、股票行情推送、在线协作、多人游戏等。相比传统的 HTTP 轮询方式&#xff0c;WebSocket 减少了带宽开销&#xff0c;提高了实时性。 在 Python 中&#xff…...

php根据一个数组里面的元素顺序来排序另外一个数组的的顺序

根据arr2的顺序来排序arr $arr [[size_id > 9],[size_id > 1],[size_id > 1],[size_id > 6],[size_id > 6],[size_id > 8],];$arr2 [1,9,6,8];usort($arr, function ($item1, $item2) use ($arr2) {return array_search($item1[size_id], $arr2) - array_s…...

从JVM到分布式锁:高并发架构设计的六把密钥

【300秒速览分布式核心技术栈】 作为十年架构老兵&#xff0c;今天用一张图说透高并发系统的底层逻辑&#xff1a; &#x1f511; ​JVM锁&#xff1a;synchronized与AQS构筑单机防线&#xff0c;却难逃分布式困局 &#x1f511; ​数据库锁&#xff1a;MySQL行锁/间隙锁守住…...

《深度剖析SQL游标:复杂数据处理场景下的智慧抉择》

在数据库领域的广袤天地中&#xff0c;SQL游标宛如一把独特的钥匙&#xff0c;为复杂数据处理场景开启了一扇充满可能的大门。它以一种细腻且精准的方式&#xff0c;穿梭于数据库的记录之间&#xff0c;为众多棘手的数据处理难题提供了解决之道。 复杂数据处理场景的挑战 随着…...

【数据分享】中国3254座水库集水区特征数据集(免费获取)

水库在水循环、碳通量、能量平衡中扮演关键角色&#xff0c;实实在在地影响着我们的生活。其功能和环境影响高度依赖于地理位置、上游流域属性&#xff08;如地形、气候、土地类型&#xff09;和水库自身的动态特征&#xff08;如水位、蒸发量&#xff09;。但在此之前一直缺乏…...