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

类之间的纵向关系——继承

继承

定义:被继承的类叫做基类(父类),继承的类叫派生类(子类),在派生类类名后面加

: 继承方式 基类

class CFather{};
class CSon:public CFather{};

父类(基类)与子类(派生类)之间的关系:

把一些功能相似的类,类中公共的成员单独抽离出来,放到一个类中,这个类就是父类

子类如何使用父类对象 :

通过继承关系,子类可以使用父类的成员。如果子类和父类有同名的成员,默认使用子类的成员,如果想要使用父类的成员,需要在成员名前加上类名::用于显式的指定区分,

son.m_a; //子类成员
son.CSon::m_a; //子类成员
son.CFather::m_a; //父类成员

 子类继承父类,相当于将父类的成员包含到自己的类里,所以定义子类对象所占用的空间大小除了子类自身的成员还包括父类的成员。成员在内存空间分布为:先父类成员后子类成员,而每个类中的成员分布与在类中声明的顺序一致。

 

 三种继承方式:

继承方式与访问修饰符一样,都是三种
继承方式:描述了父类的成员在子类中所能使用的范围,即访问控制。继承方式和访问修饰符共同决定了父类成员的访问权限。

继承格式:

class 子类名:继承方式 父类名

class CSonson :public CSon{};

 

private:继承下
父类子类
private:不可访问
protected:private:
public:private:
protected:继承下
父类子类
private:不可访问
protected:protected:
public:protected:
public:继承下
父类子类
private:不可访问
protected:protected:
public:public:

继承下构造析构执行的顺序:

定义子类对象时执行顺序:父构造->子构造->孙构造...| ...孙析构->子析构->父析构。

 构造顺序说明:

在子类创建对象的时候,执行子类的构造函数(注意这里并不是直接先执行父类的构造函数),但要先执行子类的构造的初始化列表,在初始化列表中会默认调用父类的无参构造初始化父类成员,如果父类只有带参数的构造,那么需要在子类的初始化参数列表显示的指定父类的初始化。

析构顺序说明:

子类对象的生命周期结束后,因为是子类所以自动调用子类析构,当析构执行完了,才会回收对象分配的空间,当然这个空间包含创建的父类的成员,那么回收父类成员前,自动调用父类的析构。如果是new出来的子类对象,同理。 

 继承的优点:

多个子类在增加公共方法时,只需要在父类添加一份即可,提高了代码的复用性,扩展性。

 隐藏

定义

隐藏:在继承的条件下,父类和子类中有同名的成员,那他们之间的关系称为隐藏。

如果子类中没有函数,则他会调用父类的函数,但当调用父类和子类的同名成员方法时,他会调用子类中的函数,将传输的参数转换成子类中的函数所需类型,如果转换不了则会报错。父类和子类中,同名的但是参数列表不同的函数,他们之间的关系并不是函数重载的关系,作用域不同,必须使用 类名:: 去区分到底该调用哪个函数。

class CFather {void fun();
};
class CSon :public CFather {void fun(int a); //隐藏关系,自动将父类的成员屏蔽了
};

 注:父类指针不强转,也可以指向子类对象;而子类的指针必须通过强转才能指向父
亲对象。

 父类指针指向子类对象

CFather * p = new CSon;

 优点:统一多种子类类型,提高代码的复用性和扩展性
弊端:只能使用父类的成员,不能使用子类的成员

http://www.lryc.cn/news/585056.html

相关文章:

  • rom定制系列------红米note10 5G版camellia原生安卓14批量线刷 miui安卓11修改型号root版
  • bash中||与的区别
  • consul 的安装与服务发现
  • Python PDFplumber详解:从入门到精通的PDF处理指南
  • Java 深入解析:JVM对象创建与内存机制全景图
  • mysql中的自增ID
  • k8s-高级调度(一)
  • cefSharp.WinForms.NETCore 138.xx (cef138/Chromium 138.0.7204.97) 升级测试体验
  • 《从依赖纠缠到接口协作:ASP.NET Core注入式开发指南》
  • tcp/quic 的滑动窗口
  • 基于ASP.NET+SQL Server实现(Web)企业进销存管理系统
  • 虹科分享 | 告别实体钥匙!数字钥匙正在重构你的用车体验
  • 大模型及agent开发6 OpenAI Assistant API 高阶应用 - 流式输出功能
  • 【Kubernetes】Ubuntu 24.04 安装 K3s v1.33.2+k3s
  • 上半年净利预增66%-97%,高增长的赛力斯该咋看?
  • windows配置python环境
  • 【面板数据】省级泰尔指数及城乡收入差距测算(1990-2024年)
  • MySQL 的语言体系
  • Tomasulo算法是什么?
  • PCB 层压板各向异性:对高级过孔建模的影响
  • AMTS AHTE | 具身智能成制造升级新引擎 灵途科技助力更强感知
  • 1965–2022年中国大陆高分辨率分部门用水数据集,包含:灌溉用水、工业制造用水、生活用水和火电冷却
  • MDSE模型驱动的软件工程和敏捷开发相结合的案例
  • 淘宝拍立淘接口技术解析:从原理到实践‌
  • 1.1.2 运算符与表达式——AI教你学Django
  • [WinForms] 如何为 .NET Framework 4.8 窗体程序添加自定义图标
  • 多租户架构下的多线程处理实践指南
  • 【网络】Linux 内核优化实战 - net.netfilter.nf_conntrack_max
  • 【网络】Linux 内核优化实战 - net.netfilter.nf_conntrack_buckets
  • 番外-linux系统运行.net framework 4.0的项目