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

C++ | 继承(基类,父类,超类),(派生类,子类)

文章参考:https://blog.csdn.net/war1111886/article/details/8609957

一 .继承中的访问权限关系
1.基类,父类,超类是指被继承的类,派生类,子类是指继承于基类的类. 

2.在C++中使用: 冒号表示继承,如class A : public B;表示派生类A从基类B继承而来

3.派生类包含基类的所有成员,而且还包括自已特有的成员,派生类和派生类对象访问基类中的成员就像访问自已的成员一样,可以直接使用,不需加任何操作符,但派生类仍然无法访问基类中的私有成员.

4.在C++中派生类可以同时从多个基类继承,Java 不充许这种多重继承,当继承多个基类时,使用逗号将基类隔开.

5.基类访问控制符

     class A : public B        基类以公有方式被继承,

     class A:private B        基类以私有方式被继承,

     class A:protected B    基类以受保护方式被继承,如果没有访问控制符则默认为私有继承。

6. protected 受保护的访问权限:使用protected 保护权限表明这个成员是私有的,但在派生类中可以访问基类中的受保护成员。派生类的对象就不能访问受保护的成员了。

7. 如果基类以public公有方式被继承,则基类的所有公有成员都会成为派生类的公有成员.受保护的基类成员成为派生类的受保护成员
      如果基类以private私有被继承,则基类的所有公有成员都会成为派生类的私有成员.基类的受保护成员成为派生类的私有成员. 

      如果基类以protected 受保护方式被继承,那么基类的所有公有和受保护成员都会变成派生类的受保护成员.

     不管基类以何种方式被继承,基类的私有成员,仍然保有其私有性,被派生的子类不能访问基类的私有成员.

例:继承中的访问权限关系
 

class A {int a;protected:int b;public:int c;A() { a = b = c = 1; }};//类B以公有方式从基类A继承class B : public A {public:int d;B() {//a=2;  //错误,不能访问基类中的私有成员b = 2;   //正确,可以在类中访问基类中的受保护成员,但类的对象不能访问,基类中的受保护成员b在类B中仍然是受保护成员c = d = 2;}}; //基类中的公有成员c在类B中仍然是公有成员//类C以受保护和私有方式从基类A继承。class C : protected A {public:int e;C() {//a=3;  //错误,不能访问基类中的私有成员b = c = e = 3;}};//这里基类受保护成员b和公有成员c都成为类C中的受保护成员。class D : private A {public:D(){ b = c = 4; }};//基类中的公有和受保护成员都成为了类D中的私有成员。//验证受保护和私有方式继承的访问权限。class C1 : public C {public:C1() { b = c = e = 4; }};//正确;类A中的成员b和c在类C中是以受保护方式被继承的,b和c都成为了类C中的受保护成员。class D1 : public D {public:D1() {//b=5; //错误,在A中受保护的成员b在类D中是以私有方式继承的,这样b就成为了类D中的私有成员,所以无法访问。//c=5; //错误,在A中公有的成员c在类D中是以私有方式继承的,这样c就成为了类D中的私有成员,所以无法访问。}};int main(){A m1;B m2;C m3;D m4;//cout<<m1.b<<m2.b<<m3.b<<m4.b<<endl;   //错误;不能用类的对象访问受保护的成员,只有在类中才能访问。cout << m1.c <<endl;cout << m2.c <<endl;//cout<<m3.c<<endl;    //错误,类C是以受保护的方式从A继承的,基类中的变量c在类C中就是受保护的,所以类的对象不能访问//cout<<m4.c<<endl;    //错误,类C是以私有的方式从A继承的,基类中的变量c在类C中就是私有的,所以类的对象不能访}

二.覆盖和隐藏基类成员变量或成员函数
1. 基类的成员变量或函数被覆盖:

如果派生类覆盖了基类中的成员函数或成员变量,则当派生类的对象调用该函数或变量时是调用的派生类中的版本,当用基类对象调用该函数或变量时是调用的基类中的版本。

2. 隐藏基类成员函数的情况:

如果在派生类中定义了一个与基类同名的函数,不管这个函数的参数列表是不是与基类中的函数相同,则这个同名的函数就会把基类中的所有这个同名的函数的所有重载版本都隐藏了,这时并不是在派生类中重载基类的同名成员函数,而是隐藏,比如类A中有函数 f (int i , int j)和 f (int i)两个版本,当在从A派生出的类B中定义了基类的 f() 函数版本时,这时基类中的 f (int i)和f (int i , int j)就被隐藏了,也就是说由类B创建的对象比如为m,不能直接访问类A中的f(int i)版本,即使用语句m.f(2)时会发生错误。

3. 怎样使用派生类的对象访问基类中被派生类覆盖或隐藏了的函数或变量:

      3.1. 方法1   使用作用域运算符:: ,在使用对象调用基类中的函数或变量时使用作用域运算符即语句m.A::f(2),这时就能访问基类中的函数或变量版本。注意,访问基类中被派生类覆盖了的成员变量只能用这种方法
      3.2.方法2   使用using:: , 该方法只适用于被隐藏或覆盖的基类函数,在派生类的类定义中使用语句using 把基类的字包含进来,比如using A::f;就是将基类中的函数f()的所有重载版本包含进来,重载版本被包含到子类之后,这些重载的函数版本就相当于是子类的一部分,这时就可以用派生类的对象直接调用被派生类隐藏了的基类版本,比如m.f(2),但是使用这种语句还是没法调用基类在派生类中被覆盖了的基类的函数,比如m.f()调用的是派生类中定义的函数f,要调用被覆盖的基类中的版本要使用语句m.A::f()才行。

4. 在派生类的函数中调用基类中的成员变量和函数的方法:

就是在函数中使用的被派生类覆盖的基类成员变量或函数前用作域解析符加上基类的类名,即A::f()就是在派生类的函数中调用基类中被派生类覆盖了的函数f()的方法。

5. 派生类以私有方式被继承时改变基类中的公有成员为公有的方法:

      5.1.使用:: 作用域运算符,不提倡用这种方法,在派生类的public 后面用作用域运算符把基类的公有成员包含进来,这样基类的成员就会成为派生类中的公有成员了,注意如果是函数的话后面不能加括号,如A::f;如果f是函数的话不能有括号。
      5.2.使用using语句,现在一般用这种方法,也是在派生类的public使用using把基类成员包函进来,如using A::f。

例:隐藏或覆盖基类中的成员,使用::作用域运算符访问
————————————————
版权声明:本文为CSDN博主「Sherlock_Homles」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Sherlock_Homles/article/details/82927515

class A {int a;
protected:int b;
public:int c, d;void f(int i) {cout << "class A" << "\n";}A() { a = b = c = d = 1; }
};class B : public A {
public:int d;//覆盖基类中的成员变量d。B() {b = c = d = 2;            //这里是给子类B中的成员变量d赋值,而不是基类中的dA::d = 3;} //给基类中被覆盖的成员d赋值,注意在类中访问的被覆盖成员的方式。void f() {cout << "class B" << "\n";  //在子类中重定义基类中的同名函数,虽然参数列表不一样,但同样会隐藏基类中的同名函数A::f(1);    //在函数中调用基类中被隐藏了的同名函数的方法,使用作用域解析运算符。//f(1);       //错误,因为基类中的函数被子类中的同名函数隐藏了,在这里子类不知道有一个带参数的函数f。}
};int main() {B m;cout << m.d << "\n";      //输出子类中的成员变量d的值,注意派生类中覆盖了基类成员d.cout << m.A::d << "\n";   //输出基类中的成员变量d的值,注意这是使用对象访问被覆盖的基类成员的方式m.f();                    //调用子类中的不带参数的函数f。// m.f(2);                   //错误,因为基类中的带一个参数的函数f被子类中的同名函数隐藏掉了,不能这样访问,须用作用域解析运算符来访问。m.A::f(1);} //使用子类对象访问基类中被隐藏的函数的方法。

例:使用using 语句以便访问基类中被隐藏的函数

class A {int a;
protected:int b;
public:int c, d;void f() { cout << "Amoren" << "\n"; }void f(int i) { cout << "class A" << "\n"; }A() { a = b = c = d = 1; }
};class B : public A {
public:int d;//覆盖基类中的成员变量d。B() {b = c = d = 2;  //这里是给类B中的成员变量d赋值,而不是基类中的dA::d = 3;} //给基类中被覆盖的成员d赋值,注意在类中访问的被覆盖成员的方式。using A::f;        //使用语句using把类A中的函数f包含进来,以便以后可以直接访问基类被隐藏了的函数,注意函数f没有括号void f() {cout << "class B" << "\n";  //在子类中覆盖基类中的同名函数,注意这里是覆盖,同时会隐藏基类中的其他同名重载函数f(1);       //正确,因为使用了using语句,所以可以在类中直接使用基类中f函数的重载版本。A::f(2);    //正确,虽然使用了using语句,但同样可以按这种方法访问基类中的函数。A ma;ma.f();     //正确,在子类中创建的基类对象,可以直接用对象名调用基类中被子类覆盖或隐藏了的函数,因为这时不会出现二义性。ma.f(1);    //正确,在子类中创建的基类对象,可以直接用对象名调用基类中被子类覆盖或隐藏了的函数,因为这时不会出现二义性。}void g() {cout << "this g" << "\n"; f();        //正确,但该语句访问的是子类中的不带参数函数f,虽然在类中使用了using语句,但直接调用被子类覆盖了的基类函数时不能使用这种方法A::f();     //正确,调用被子类覆盖了的基类中的函数f,注意,虽然使用了using但要访问被子类覆盖了的函数,只能这样访问。}
};
int main() {B m;m.f();       //调用子类中的不带参数的函数,这里不会调用基类中的不带参数的被覆盖的函数f。m.A::f();    //调用基类中被子类覆盖了的函数f,虽然子类使用了using语句,但要访问基类中被覆盖的方法只能像这样使用。m.f(1);      //调用基类重载的f函数,注意这里可以不用::运算符,因为在子类中使用了using,只要子类没有覆盖基类中的方法,都可以这样直接调用。m.A::f(2);   //当然,使用了using后,也可以使用这种方法
} 

例:派生类以私有方式被继承时改变基类中的公有成员为公有的方法

class A {
public:int a, b;void f() { cout << "f" << "\n"; }void g() { cout << "g" << "\n"; }
};class B : private A {
public:A::f;         //使用::运算符使基类中的成员成为公有的。注意函数名后不能有括号。(C++11标准不允许,使用using A::f)A::a;         //(C++11标准不允许,使用using A::a)using A::g;   //使用using语句使基类中的成员函数g成为类B中的公有成员,注意函数名后不能有括号。
};
int main() {B m;//m.b=1;        //错误,因为类B是以私有方式继承的,类A中的成员在类B中是私有的,这里不能访问私有成员。m.f();m.g();m.a = 1;
}

三.继承时的构造函数和析构函数问题
1. 在继承中,基类的构造函数构建对象的基类部分,派生类的构造函数构建对象的派生类部分。

2. 当创建派生类对象时先用派生类的构造函数调用基类的构造函数构建基类,然后再执行派生类构造函数构造派生类。
即先构造基类再构造派生类的顺序。执行析构函数的顺序与此相反。

3. 调用基类带参数的构造函数的方法:

在派生类的构造函数中使用初始化列表的形式就可以调用基类带参数的构造函数初始化基类成员,如B():A(int i){},类B是类A的派生类。

4. 派生类的构造函数调用基类的构造函数的方法为:

4.1 如果派生类没有显示用初始化列表调用基类的构造函数时,这时就会用派生类的构造函数调用基类的默认构造
函数,构造完基类后,才会执行派生类的构造函数函数体,以保证先执行基类构造函数再执行派生类构造函数
的顺序,如果基类没有默认构造函数就会出错。
4.2 如果派生类用 显示的初始化列表调用基类的构造函数时,这时就会检测派生类的初始化列表,当检测到显示调
用基类的构造函数时,就调用基类的构造函数构造基类,然后再构造派生类,以保证先执行基类构造函数再执
行派生类构造函数的顺序,如果基类没有定义派生类构造函数初始化列表调用的构造函数版本就会出错。

5. 如果在基类中没有定义默认构造函数,但定义了其他构造函数版本,这时派生类中定义了几个构造函数的不同版本,
这时只要派生类有一个构造函数没有显示调用基类中定义的构造函数版本就会发生错误,因为编译器会首先检查派
生类构造函数调用基类构造函数的匹配情况,如果发现不匹配就会出错,即使没有创建任何类的对象都会出错,而
不管这个派生类的对象有没有调用派生类的这个构造函数。比如:基类有一个构造函数版本A(int i)而没有定义默认
构造函数,派生类B,有这几个版本的构造函数B():A(4){},B(int i):A(5){},再有语句B(int i, int j){}没有显示调用
基类定义的构造函数而是调用基类的默认构造函数,如果创建了B m和语句B m(1)时都会提示没有可用的基类默认
构造函数可用的错误,虽然这时类B的对象m没有调用派生类B的带有两个形参的构造函数,但同样会出错。

6. 同样的道理,如果基类中定义了默认构造函数,却没有其他版本的构造函数,而这时派生类却显示调用了基类构造
函数的其他版本,这时就会出错,不管你有没有创建类的对象,因为编译器会先在创建对象前就检查构造函数的匹
配问题。

7. 派生类只能初始化他的直接基类。比如类C是类B的子类,而类B又是类A的子类,这时class C:public B{public:
B():A(){} };将会出错,该语句试图显示调用类B的基类类A的构造函数,这时会出现类A不是类C的基类的错误。

8. 继承中的复制构造函数和构造函数一样,基类的复制构造函数复制基类部分,派生类的复制构造函数复制派生类部
分。

9.派生类复制构造函数调用基类复制构造函数的方法为:A(const A& m):B(m){}其中B是基类,A是派生类。

10.如果在派生类中定义了复制构造函数而没有用初始化列表显示调用基类的复制构造函数,这时不管基类是否定义了
复制构造函数,这时出现派生类对象的复制初始化情况时就将调用基类中的默认构造函数初始化基类的成员变量,
注意是默认构造函数不是默认复制构造函数,如果基类没有默认构造函数就会出错。也就是说派生类的复制构造函
数的默认隐藏形式是B(const B& j):A(){}这里B是A的派生类,也就是说如果不显示用初始化列表形式调用基类的
复制构告函数时,默认情况下是用初始化列表的形式调用的是基类的默认构造函数。

11.当在派生类中定义了复制构造函数且显示调用了基类的复制构造函数,而基类却没有定义基类的复制构造函数时,
这时出现派生类对象的复制初始化情况就将调用基类中的默认复制构造函数初始化基类部分,调用派生类的复制构
造函数初始化派生类部分,因为复制构造函数只有一种形式,即A(const A& m){},比如当出现调用时A(const A&
m):B(m){}如果这时基类B没有定义复制构造函数,则该语句将会调用派生类A的默认复制构造函数。

12.如果基类定义了复制构造函数,而派生类没有定义时,则会调用基类的复制构造函数初始化基类部分,调用派生类
的默认复制构造函数初始化派生类部分。
 

相关文章:

C++ | 继承(基类,父类,超类),(派生类,子类)

文章参考&#xff1a;https://blog.csdn.net/war1111886/article/details/8609957 一 .继承中的访问权限关系 &#xff11;&#xff0e;基类&#xff0c;父类&#xff0c;超类是指被继承的类&#xff0c;派生类&#xff0c;子类是指继承于基类的类&#xff0e; &#xff12;…...

Commands Of Hadoop

序言 持续整理下常用的命令cuiyaonan2000163.com Command 文件拷贝 当从多个源拷贝时&#xff0c;如果两个源冲突&#xff0c;distcp会停止拷贝并提示出错信息&#xff0c;. 如果在目的位置发生冲突&#xff0c;会根据选项设置解决。 默认情况会跳过已经存在的目标文件&am…...

SQL-每日一题【620.有趣的电影】

题目 某城市开了一家新的电影院&#xff0c;吸引了很多人过来看电影。该电影院特别注意用户体验&#xff0c;专门有个 LED显示板做电影推荐&#xff0c;上面公布着影评和相关电影描述。 作为该电影院的信息部主管&#xff0c;您需要编写一个 SQL查询&#xff0c;找出所有影片…...

linux 精华总结

...

Eureka 学习笔记2:客户端 DiscoveryClient

版本 awsVersion ‘1.11.277’ DiscoveryClient # cacheRefreshTask // 配置shouldFetchRegistry if (clientConfig.shouldFetchRegistry()) {// 配置client.refresh.intervalint registryFetchIntervalSeconds clientConfig.getRegistryFetchIntervalSeconds();// 配置expB…...

okhttp原理分析

工程目录图 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 01okhttp module里 包含的设计模式&#xff1a;建造者设计模式、责任链设计模式 CustomInject 演示自定义注解 代码&#xff1a;okhttp原理分析、Andro…...

freeswitch的mod_xml_curl模块

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 随着fs服务的增多&#xff0c;每一台fs都需要在后台单独配置&#xff0c;耗时耗力&#xff0c;心力憔悴。 如果有一个集中管理配置的配置中心&#xff0c;统一管理所有fs的配置&#xff0c;并可以实现动态的修改配置就…...

高速数据采集专家-FMC140【产品手册】

FMC140是一款具有缓冲模拟输入的低功耗、12位、双通道&#xff08;5.2GSPS/通道&#xff09;、单通道10.4GSPS、射频采样ADC模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.1规范&#xff0c;该模块可以作为一个理想的IO单元耦合至FPGA前端&#xff0c;8通道的JESD204…...

【SSM】知识集锦

项目一&#xff1a;狂神JAVA 功能1&#xff1a;实现全部书籍查询 1.思路&#xff1a;首页index.jsp ——>Controller——>hello.jsp 2.步骤&#xff1a; step1:index.jsp <% page language"java" contentType"text/html; charsetUTF-8" page…...

Flowable-中间事件-信号中间抛出事件

定义 当流程执行到达信号抛出事件时&#xff0c;流程引擎会直接抛出信号&#xff0c;其他引用了与其相同的信号捕获 事件会被触发&#xff0c;信号发出后事件结束&#xff0c;流程沿后继路线继续执行。其抛出的信号可以被信号开始事 件&#xff08;Signal Start Event&#xf…...

【算法基础:动态规划】5.3 计数类DP(整数拆分、分拆数)

文章目录 例题&#xff1a;900. 整数划分解法1——完全背包解法2——分拆数⭐⭐⭐ 例题&#xff1a;900. 整数划分 https://www.acwing.com/problem/content/902/ 解法1——完全背包 容量是 n&#xff0c;物品的大小和价值是 1 ~ n 中的所有数字。 import java.util.*;pub…...

封装(Encapsulation)

目录 概念 好处 数据隐藏 模块化设计 代码复用 简化接口 示例 意义 概念 封装&#xff08;Encapsulation&#xff09;是面向对象编程的一个核心概念&#xff0c;它指的是将数据和相关操作封装在一个对象中&#xff0c;隐藏了实现的细节。&#xff08;就是实现数据封装和…...

php 原型模式

一&#xff0c;原型模式&#xff0c;就是先创建好一个原型对象&#xff0c;然后通过拷贝原型对象来生成新的对象。适用于大对象的创建&#xff0c;因为每次new一个大对象会有很大的开销&#xff0c;原型模式仅需内存拷贝即可。 原型模式中的主要角色&#xff1a; 1&#xff0c;…...

LiveGBS流媒体平台GB/T28181功能-支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放

LiveGBS支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放 1、背景2、分屏展示3、选择轮播通道4、配置轮播间隔(秒)5、点击开始轮播6、轮播停止及全屏7、搭建GB28181视频直播平台 1、背景 视频监控项目使用过程中&#xff0c;有时需要大屏值守&#xff0c;值守的时候多分…...

6、Nginx实现反向代理

Nginx 反向代理是一种常见的应用场景&#xff0c;它允许 Nginx 作为中间服务器接收客户端的请求&#xff0c;并代理转发这些请求到后端的真实服务器。这种配置使得客户端只需要与 Nginx 交互&#xff0c;而后端服务器对客户端是透明的。 ngx_http_proxy_module&#xff1a; 将客…...

Leetcode——404 左叶子之和

404. 左叶子之和 难度简单&#xff08;虽然简单 但是我用递归做时 还是有点坑的&#xff09; 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子…...

R并行计算-parallel例子1

前言&#xff1a; 通常&#xff0c;如果进程运行时间超过3分钟&#xff0c;则会考虑使用并行处理。 这听起来可能很复杂&#xff0c;但是并行计算很简单。 当你有一个重复的任务&#xff0c;它占用了你太多宝贵的时间&#xff0c;为什么不使用并行计算来节省时间呢&#xff…...

JavaSE复盘2

Collection接口的接口对象集合&#xff08;单列集合&#xff09; List接口&#xff1a;元素按照先后有序保存&#xff0c;可重复 LinkList接口实现类&#xff0c;链表&#xff0c;随机访问&#xff0c;没有同步&#xff0c;线程不安全ArrayList接口实现类&#xff0c;数组&…...

如何在3ds max中创建可用于真人场景的巨型机器人:第 3 部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 创建腿部装备 步骤 1 打开 3ds Max。 打开在本教程最后一部分中保存的文件。 打开 3ds Max 步骤 2 转到创建> 系统并单击骨骼。 创建>系统 步骤 3 为的 侧视口中的腿&#xff0c;如下图所示…...

Android性能优化之游戏引擎初始化ANR

近期&#xff0c;着手对bugly上的anr 处理&#xff0c;记录下优化的方向。 借用网上的一张图&#xff1a; 这里的anr 问题是属于主线程的call 耗时操作。需要使用trace 来获取发生anr前一些列的耗时方法调用时间&#xff0c;再次梳理业务&#xff0c;才可能解决。 问题1 ja…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...