C++单继承

【C++】继承(下) 单继承 | 多继承 | 菱形继承 | 继承和组合 这里说明下 优先用组合 的原因: 继承是一种白箱复用。所谓白箱复用,就是透明可视化的一种复用,父类的内部细节对子类可见。这在一定程度上破坏了父类的封装。 并且,父类和子类的依赖关系很强,耦合度很高。试想,假如父类的某个成员被修改了,那在所有的子类中也会遭到修改。 而组合是一种黑箱复用。黑箱复用是另一种 阅读详情
在《基类和派生类》中讲述了单继承的基本概念,这节着重讲述继承的具体应用。

  在单继承中,每个类可以有多个派生类,但是每个派生类只能有一个基类,从而形成树形结构。

  成员访问权限的控制

  在《基类和派生类》一讲中,我们讲述了派生类和派生类的对象对基类成员的访问权限的若干规定,这里通过一个实例进一步讨论访问权限的具体控制,然后得出在使用三种继承方式时的调用方法。

//继承性的public继承方式的访问权限的例子
#include

file://定义基类A
class A
{
public:
A() { cout<<"类A的构造函数!"< A(int a) { Aa = a, aa = a, aaa = a; }
void Aprint() { cout<<"类A打印自己的private成员aa:"< int Aa;
private:
int aa;
protected:
int aaa;
};

file://定义由基类A派生的类B
class B : public A
{
public:
B() { cout<<"类B的构造函数!"< B(int i, int j, int k);
void Bprint() { cout<<"类B打印自己的private成员bb和protected成员bbb:"< void B_Aprint() { cout<<"类B的public函数访问类A的public数据成员Aa:"< cout<<"类B的public函数访问类A的protected数据成员aaa:"< GetAaaa();
GetAaaa1();}
private:
int bb;
void GetAaaa() { cout<<"类B的private函数访问类A的public数据成员Aa:"< cout<<"类B的private函数访问类A的protected数据成员aaa:"< protected:
int bbb;
void GetAaaa1() { cout<<"类B的protected函数访问类A的public数据成员Aa:"< cout<<"类B的protected函数访问类A的protected数据成员aaa:"< };

file://基类B的构造函数,需负责对基类A的构造函数的初始化
B::B(int i, int j, int k):A(i), bb(j), bbb(k) {}

file://程序主函数
void main()
{
B b1(100, 200, 300); file://定义类B的一个对象b1,并初始化构造函数和基类构造函数
b1.B_Aprint(); file://类B调用自己的成员函数B_Aprint函数
b1.Bprint(); file://类B对象b1访问自己的private和protected成员
b1.Aprint(); file://通过类B的对象b1调用类A的public成员函数
}


  该程序的输出结果为:

   类B的public函数访问类A的public数据成员Aa:100

   类B的public函数访问类A的protected数据成员aaa:100

   类B的private函数访问类A的public数据成员Aa:100

   类B的private函数访问类A的protected数据成员aaa:100

   类B的protected函数访问类A的public数据成员Aa:100

   类B的protected函数访问类A的protected数据成员aaa:100

   类B打印自己的private成员bb和protected成员bbb:200,300

   类A打印自己的private成员aa:100

  上述是属public继承方式,我们可以得出以下结论:

  在公有继承(public)时,派生类的public、private、protected型的成员函数可以访问基类中的公有成员和保护成员;派生类的对象仅可访问基类中的公有成员。

  让我们把继承方式public改为private,编译结果出现1处如下错误:

   'Aprint' : cannot access public member declared in class 'A'

  出错语句在于:b1.Aprint();,因此,我们可以得出以下结论:

  在公有继承(private)时,派生类的public、private、protected型的成员函数可以访问基类中的公有成员和保护成员;但派生类的对象不可访问基类中的任何成员。另,使用class关键字定义类时,缺省的继承方式是private,也就是说,当继承方式为私有继承时,可以省略private。

  让我们把继承方式public改为protected,可以看出,结果和private继承方式一样。

  构造函数和析构函数

  派生类的构造函数和析构函数的构造是讨论的主要问题,读者要掌握它。

  1. 构造函数

  我们已知道,派生类的对象的数据结构是由基类中说明的数据成员和派生类中说明的数据成员共同构成。将派生类的对象中由基类中说明的数据成员和操作所构成的封装体称为基类子对象,它由基类中的构造函数进行初始化。

  构造函数不能够被继承,因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。所以,在定义派生类的构造函数时除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类数据成员得以初始化。如果派生类中还有子对象时,还应包含对子对象初始化的构造函数。

  派生类构造函数的一般格式如下:

  <派生类名>(<派生类构造函数总参数表>):<基类构造函数>(参数表1),<子对象名>(<参数表2>)
  {
  <派生类中数据成员初始化>
  };

  派生类构造函数的调用顺序如下:

   · 基类的构造函数

   · 子对象类的构造函数(如果有的话)

   · 派生类构造函数

  在前面的例子中,B::B(int i, int j, int k):A(i), bb(j), bbb(k)就是派生类构造函数的定义,下面再举一个构造派生类构造函数的例子。

#include
class A
{
public:
A() { a=0; cout<<"类A的缺省构造函数./n"; }
A(int i) { a=i; cout<<"类A的构造函数./n"; }
~A() { cout<<"类A的析构函数./n"; }
void Print() const { cout< int Geta() { reutrn a; }
private:
int a;
}
class B : public A
{
public:
B() { b=0; cout<<"类B的缺省构造函数./n"; }
B(int i, int j, int k);
~B() { cout<<"类B的析构函数./n"; }
void Print();
private:
int b;
A aa;
}
B::B(int i, int j, int k):A(i), aa(j)
{
b=k;
cout<<"类B的构造函数./n";
}
void B::Print()
{
A::Print();
cout< }

void main()
{
B bb[2];
bb[0] = B(1, 2, 5);
bb[1] = B(3, 4, 7);
for(int i=0; i<2; i++)
bb[i].Print();
}


  2. 构造函数

  当对象被删除时,派生类的析构函数被执行。由于析构函数也不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。执行顺序是先执行派生类的构造函数,再执行基类的析构函数,其顺序与执行构造函数时的顺序正好相反。这一点从前面讲过的例子可以看出,请读者自行分析。

  3. 派生类构造函数使用中应注意的问题

  (1) 派生类构造函数的定义中可以省略对基类构造函数的调用,其条件是在基类中必须有缺省的构造函数或者根本没有定义构造函数。当然,基类中没有定义构造函数,派生类根本不必负责调用基类的析构函数。

  (2) 当基类的构造函数使用一个或多个参数时,则派生类必须定义构造函数,提供将参数传递给基类构造函数途径。在有的情况下,派生类构造函数的函数体可能为空,仅起到参数传递作用。如本讲第一个例子就属此种情况。

  子类型化和类型适应

  1. 子类型化

  子类型的概念涉及到行为共享,它与继承有着密切关系。

  有一个特定的类型S,当且仅当它至少提供了类型T的行为,由称类型S是类型T的子类型。子类型是类型之间的一般和特殊的关系。

  在继承中,公有继承可以实现子类型。例如:

class A
{
public:
void Print() const { cout<<"A::print() called./n"; }
};
class B : public A
{
public:
void f() {}
};


  类B继承了类A,并且是公有继承方式。因此,可以说类B是类A的一个子类型。类A还可以有其他的子类型。类B是类A的子类型,类B具备类A中的操作,或者说类A中的操作可被用于操作类B的对象。

  子类型关系是不可逆的。这就是说,已知B是A的子类型,而认为A也是B的子类型是错误的,或者说,子类型关系是不对称不。

  因此,可以说公有继承可以实现子类型化。

  2. 类型适应

  类型适应是指两种类型之间的关系。例如,B类型适应A类型是指B类型的对象能够用于A类型的对象所能使用的场合。

  前面讲过的派生类的对象可以用于基类对象所能使用的场合,我们说派生类适应于基类。

  同样道理,派生类对象的指针和引用也适应于基类对象的指针和引用。

  子类型化与类型适应是致的。A类型是B类型的子类型,那么A类型必将适应于B类型。

  子类型的重要性就在于减轻程序人员编写程序代码的负担。因为一个函数可以用于某类型的对象,则它也可以用于该类型的各个子类型的对象,这样就不必为处理这些子类型的对象去重载该函数。
C++中的单继承与多继承(上) 声明: 1. 本文主要讲述c++中的继承,着重讲述单继承和多继承,并贴出源代码,其中附带详细的英文注释。仅供入门级的c++爱好者参考和使用。 2. 若有缺点或不足希望大牛能指点迷津,本人邮箱:WSQXHoney520@126.com。本人QQ:595014831 3. 希望大家看完后积极发帖,以资鼓励和交流。我会及时回复!!!! 一、几个基本概念: 继承:就是利用已有的数据类型定 阅读详情

相关推荐

c++: C++ 基类-继承-单继承-多继承

1. 基类 官方解释是:在面向对象设计中,被定义为包含所有实体共性的class类型,被称为“基类”。 这个解释通俗的说就是:里面有public和private或者protected之类具体函数和变量定义的类,例如: class Base { public: void f(int x){ cout &lt;&lt; "Base::f(int) " &lt;&lt; ...

DinnerHowe的博客 1863

[第四天】C++继承:单继承、多继承、菱形继承和虚继承的深度解析

class 父类{};class 子类:继承方式 父类名//新增子类数据继承方式:private protected public(推荐)公共继承 保持不变,保护继承变保护,私有继承变私有,所有父类私有在子类中不可见。子类虚继承父类 子类只会保存一份公共数据。方式:在继承方式 前加virtual修饰。

m0_75045191的博客 2408

探索C++继承:从单继承到多重继承

本文详细探讨了C++编程中的继承概念,从单继承深入到多重继承的实现和应用场景。通过分析具体的类定义和主函数,揭示了如何通过继承建立类的层次结构,以及如何在类之间共享数据和行为。文章还讨论了继承在真实世界中的意义,并通过示例程序展示了如何在程序中实现继承。

weixin_42518874的博客 318

c++:继承(超详解)

目录一:什么是继承二:继承的格式继承的总结:二:子类和父类(基类和派生类)1.子类和父类的相互赋值:2.同名的成员变量3.同名成员函数三:子类中默认的成员函数1.构造函数2.析构函数3.拷贝构造4.赋值运算符重载 四:单继承和多继承单继承: 多继承:菱形继承解决方法一:解决方法二:单继承和多继承的总结:定义:继承(inheritance)机制是面向对象程序设计中使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生的新类,称派生类(或子类),被继承的类称基类(或父类)

qq_62718027的博客 8万+

c++ 班级学生学期成绩管理系统 单继承

实验题目1:班级学生学期成绩管理系统 (1)程序功能简介 灵活运用类的继承、对象成员等机制,设计一个能够实现班级学生学期成绩管理的程序。 (2)程序设计说明 ① 个人信息类CPerson的数据成员有姓名、性别、年龄、身份证号等数据成员,成员函数根据需要自行设计; ② 学生类CStudent从CPerson派生,并增加学号、CCourse对象成员数组(大小至少3个)等数据成员,并根据需要自行设计成员函数,包括能够求解所选修课程的总学分、显示某个学生基本信息和课程信息的成员函数; ③ 课程类CCourse包括课程名、学分、分数、任课老师等数据成员,成员函数根据需要自行设计; ④ 班级类CClass的数据成员有班级名称、班级人数、CStudent对象成员数组(大小由构造函数确定)等。本班级类CClass的对象成员数组需要在构造函数中用new动态分配内存空间,在析构函数中用delete释放。在CClass类中设计包括能够求解最高成绩、最低成绩和平均成绩以及通过学号查找并输出某个学生全部信息(例如Seek())等功能在内的成员函数; ⑤ 构造三十个学生的数据,每个学生都有三门课程成绩,输出并显示这些数据; ⑥ 根据类的需要添加适当的其它成员,编写完整的程序并测试。 (3)程序调试运行 运行程序查看结果,并进行源代码调试和优化。

告别视频广告:OpenWrt下luci-app-adbyby plus/lite的完整配置与避坑手册

本文详细介绍了在OpenWrt路由器上配置Adbyby Plus/Lite广告屏蔽工具的完整流程与优化方案。从环境准备、规则文件手动配置到高级性能调优,帮助用户有效拦截视频前贴片广告和弹窗广告,提升家庭网络浏览体验。特别针对官方源停止维护的问题,提供了实用的规则更新解决方案。

weixin_29306011的博客 746

C++继承初阶(单继承)

声明:该博客所有结论全在vs2019下验证,不同编译器下所得结论会有些许差异 目录 什么是继承? 继承的定义格式以及规则 总结: 继承的赋值兼容规则(public继承权限下才有这个规则) 继承中的同名隐藏(也叫重定义) 子类的默认函数 子类的构造函数 子类的拷贝构造函数 子类的赋值运算符重载 子类的析构函数 继承与静态成员变量 继承与友元 什么是继承? 继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原特性的基础上进行扩展,增加功能,这样...

m0_56910081的博客 1439

centos7下100T存储扩容(LVM)至150T

查看新增磁盘情况lsblk,fdisk -l [root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 4.2G 0 rom vda 252:0 0 80G 0 disk ├─vda1 252:1 0 1G 0 part /boot └─vda2 252:2

tiyager的博客 1025

C++对象模型:单继承,多继承,虚继承

什么是对象模型 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分。对于各种支持的底层实现机制。 类中成员分类 数据成员分为静态和非静态,成员函数有静态非静态以及虚函数 class data members:static和nonstatic class data functions:static、nonstatic和virtual 比如: class Base { public: Base(</span><span style="color: #0000...

nuosen的专栏 456

ai数字人系统部署

这段代码实现了基本的语音交互闭环,用户通过语音输入问题,数字人识别语音后进行自然语言理解并生成回复,再将回复转换为语音输出。但实际应用中的 AI 数字人系统更为复杂,如形象渲染需专业图形引擎(如 Unity、Unreal Engine),自然语言处理也会涉及更复杂的模型微调及多轮对话管理等。一个完整的 AI 数字人系统涵盖形象生成、自然语言处理、动作控制等多个复杂功能,下面为你提供一个 Python 示例,整合多个库来实现数字人基础功能,包括语音交互、简单的自然语言理解以及通过虚拟形象展示对话。

weixin_ggwwsscc的博客 370

高阶玩法——Dify生成的数据自动写入mysql数据库

采用自定义工具方式,利用 python编写一个服务sql_save_post,将接收到的内容写入指定数据库的表中,并为该服务撰写一个 OpenAPI 的 schema。配置工作流:我们以写入天气预报为例,在生成天气预报内容后,连接自定义工具“sql_save_post”,将所需的字段配置完成后,实现将生成的内容自动写入mysql数据库中。编写OpenAPI的schema:在dify平台的工具栏目,创建自定义工具,输入工具名称“sql_save_post”。工具:sql_save_post;

qq_44493378的博客 8544

第009课 C++ 单继承

基类的所有可引用的成员变量和成员函数外,还可另外定义本身的成员变量和处理这些变量的函数,由于派生类可继承基类的成员变量和成员函数,因此在。,再加上新的内容即可,以减少重复的工作量。它对派生类的对象而言,是公开成员,可以访问,在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。通过继承机制,可以利用已有的数据类型来定义新的数据类型。的,一般情况下,不能用它来产生对象,也不能用它来产生派生类。当从已有的类中派生出新的类时,可以对。类A派生类B:类A为基类,类B为派生类。但派生并不是简单的扩充,

W_Linux220的博客 996

17 指挥AI写Mamba相关模型代码,快速适配大模型场景

本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十七篇,属于第三阶段多场景实战核心内容。本篇聚焦当下大模型领域热门的**Mamba架构**,针对零基础大模型开发、无深度学习基础的使用者,拆解指挥AI生成Mamba基础模型、微调适配、推理部署代码的核心方法,覆盖Mamba基础模块搭建、简易序列建模、小样本微调、本地推理等高频场景,提供可直接复用的高质量指令模板、完整可运行代码、环境配置与避坑指南,无需精通Transformer、状态空间模型等底层原理,轻松上手Mamba大模型开发。

coreopt的博客 61

C++进阶-1-单继承、多继承、虚继承

C++中的继承是一种重要的面向对象编程特性,使得代码的组织和结构变得更加清晰。在设计类结构时,应根据项目需求和复杂性,合理选择单继承或多重继承等。

小王爱吃月亮糖的博客 1898

图文详解秋叶ComfyUI整合包开启密码访问教程(附内网穿透实战经验) ComfyUI密码、ComfyUI-Login、ComfyUI内网穿透、秋叶整合包、ComfyUI安全防护

想远程访问 ComfyUI(跨设备或公网)不希望任何人随意使用或篡改服务需要给 ComfyUI 添加登录验证机制只要按照本文教程,安装插件,并设置好用户名密码,你就能把服务加上一道强力的门槛。📌配合ngrokfrp等内网穿透工具使用公网域名推荐启用 HTTPS(SSL证书可以用宝塔/ZeroSSL 申请)密码可以设置复杂一些,定期更换更安全📬如果你在配置过程中遇到问题,欢迎评论区留言交流,或者私信我,后续我也会更新更多 ComfyUI 插件教程、安全部署经验等内容。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2742

2026年运维工程师常见面试选择题

这篇文章总结了30道Linux运维面试常见问题及解析,涵盖基础命令、系统监控、故障排查、数据库、缓存、容器编排等多个方面。主要内容包括: 基础命令使用:如df查看磁盘、free查看内存、top监控进程等 系统监控与故障排查:负载判断、端口检查、进程管理等 中间件相关:Nginx状态码、MySQL主从复制、Redis缓存问题 容器技术:Docker优势、Kubernetes作用 运维理念:高可用、监控告警、发布策略、备份容灾 工作原则:故障处理优先级、运维工程师核心能力 文章不仅提供标准答案,还解析了各命令的

不务正业的猿 194

C++单继承和多继承

继承方式为protected , 父类中的public和protected 都变为protected ,private不变。注意:1.继承的属性无论被继承多少次,都存在,A被B继承,B被C继承,C被D继承,D包含ABC中所有的属性。1.构造顺序:如果这个son继承了father这个类,先构造父类的对象,再构造自身的对象。继承:子类没有新的属性,或者行为的产生。3.私有的方式继承,可以阻断父类的属性。1.继承,主要是遗传学中的继承概念。2.继承的写法,继承中的权限问题。只有父类的继承,称之为单继承。

m0_74228185的博客 964

hive get_json_object解析json结果为null咋办?

最近一位开发的同学在使用get_json_object函数对json数据解析的时候,出现了结果为null的问题,问题原因是sql语法导致的,那么今天就来详细介绍一下解析json函数的用法!最后还是提醒小伙伴们,在开发过程中,一定要注意sql语法格式的书写,避免一些意想不到的结果!

笑看风云路的博客 2308

单继承模式下的JAVA和C++

JAVA和C++单模式继承下相同

IT1995的博客 7364

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java类单继承 C++可以多继承

文章目录java类单继承在C++支持多继承 java类单继承 java类单继承: Java的三大特性,继承、封装、多态。Java中不支持多继承,子类只能有一个父类或者没有父类。所谓继承,简单理解可以从字面意思去认识学习,就是"子"可以继承"父"所拥有的属性及方法。传承接收后就是自己的属性或方法 通过下面的例子来说明java类多继承带来的问题 class A { void method(...

LTC_1234的博客 896

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++-09-单继承

C++-单继承

jiezai66的博客 252

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

c++中的单继承、多继承和虚拟继承

在C++中,继承是面向对象编程的重要特性之一,允许一个类(称为派生类)从另一个类(称为基类)继承成员和方法。单继承、多继承和虚拟继承是三种不同的继承方式,它们有不同的特点和用途。

zengchenAAA的博客 669

C++ 单继承访问私有成员

c++ 单继承之如何调用私有成员 #include <iostream> #include <string> using namespace std; class Person { private: string name; int age; string sex; public: void setPerson(string name,int age,strin...

码小余の博客 686

详解C++中单继承与多继承的使用

继承是面向对象设计使代码可以复用的重要手段,它允许程序员在保持原有类的基础上进行扩展。被扩展的类称为基类或者父类,扩展生成的类叫做子类或者派生类,继承是类设计层次的复用。继承的作用是使得子类中既包含父类的成员,也可以包含自己的成员。看这一段代码,其中子类Student继承了父类Person,Student后的public表示的是继承方式。

m0_74824865的博客 75

c++ 单继承

C++ 单继承语法

Sico2Sico 676
上一篇: C++Builder编程中动态更改自定义打印纸张
下一篇: C++多继承
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值