六、继承(二)

Python 面向对象编程 二 继承和多继承 多重继承的概念适用于高级面向对象设计,其中对象与多个对象有关系,但从多个类继承时必须小心,特别是如果这些类是从一个公共超类继承的。同样,一个类可以从另一个类继承元素。在简单继承或基本继承中,类是从单个父类派生的。在Python中,当一个类从另一个类继承时,它通常会继承组成父类的所有元素,但这可以通过使用命名约定(如双下划线)和访问修饰符来控制。OOP中的继承概念类似于现实世界中的继承,在现实世界中,孩子们在自己的特征之上继承了父母的一些特征。通过代码可以看出,我们可以在通过子类的实例访问父类的属性和方法。 阅读详情

1 继承与友元

如果一个基类中存在友元关系,那么这个友元关系能不能继承呢?

例:

#include <iostream>
using namespace std;
class Student;
class Person
{
public:
	friend void Display(const Person& p, const Student& s);
protected:
	string _name = "张三"; // 姓名
};

class Student : public Person
{
protected:
	int _stuNum = 12345678; // 学号
};

void Display(const Person& p, const Student& s)
{
	cout << p._name << endl;
	cout << s._stuNum << endl;//访问派生类Student的成员_stuNum
}

int main()
{
	Person p;
	Student s;
	Display(p, s);
	return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从运行结果可以看到,友元关系不能继承,也就是说基类友元不能访问派生类的私有和保护成员。

如果要让基类友元访问派生类的私有和保护成员,需要在派生类中也进行声明。

例:

#include <iostream>
using namespace std;
class Student;
class Person
{
public:
	friend void Display(const Person& p, const Student& s);
protected:
	string _name = "张三"; // 姓名
};

class Student : public Person
{
public:
	friend void Display(const Person& p, const Student& s);
protected:
	int _stuNum = 12345678; // 学号
};

void Display(const Person& p, const Student& s)
{
	cout << p._name << endl;
	cout << s._stuNum << endl;
}

int main()
{
	Person p;
	Student s;
	Display(p, s);
	return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2 继承与静态成员

如果一个基类中有存在静态成员,那么在派生类中是怎么继承的呢?

例:

#include <iostream>
using namespace std;
class Person
{
public:
	Person() { ++_count; }
protected:
	string _name; // 姓名
public:
	static int _count; // 统计人的个数。
};

int Person::_count = 0;

class Student : public Person
{
protected:
	int _stuNum; // 学号
};
class Graduate : public Student
{
protected:
	string _seminarCourse; // 研究科目
};

int main()
{
	Person p;
	Student s;
	Graduate g;
	cout << &(p._count) << endl;
	cout << &(s._count) << endl;
	cout << &(g._count) << endl;
	cout << "人数:" << Person::_count << endl;
	cout << "人数:" << Student::_count << endl;
	cout << "人数:" << Graduate::_count << endl;
	return 0;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从运行结果可以看到,不管是基类还是派生类,静态成员_count的地址都是一样的,而且不管是基类还是派生类都可以对它进行访问,也就是说当基类定义了static静态成员,那么整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例。

如果我们想实现一个不能被继承的类,该怎么做呢?

实际上,我们可以将类的构造和析构函数设为私有:

#include <iostream>
using namespace std;
class A
{
private:
	A()
	{}
    //~A()
	//{}
};

class B :public A
{};
int main()
{
	B bb;
	return 0;
}

将构造函数设为私有的运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将析构函数设为私有的运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但如果这样的话,当我们想定义一个A类的对象时,也将调用不到它的构造和析构函数,那该怎么办呢?

要解决这个问题,我们就可以在A中定义一个可以静态成员函数让它来调用私有的构造函数从而实现创建对象。

#include <iostream>
using namespace std;
class A
{
public:
	static A CreatObj()
	{
		return A();
	}
private:
	A()
	{}
};

class B :public A
{};
int main()
{
	A::CreatObj();
	return 0;
}

运行结果:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这样一来,就可以实现一个不能被继承同时又不影响创建自己对象的类了。

实验六 接口、继承和多态 实验目的 1. 掌握接口的使用方法 2. 掌握子类的继承性、子类对象的创建过程 3. 掌握成员变量的继承与隐藏、方法的继承与重写 实验学时 6学时 实验内容 编写程序为公交车的老人卡、学生卡和普通市民卡提供收费功能,将充值、收费功能提取,以接口的形式定义,然后被这三种卡类实现。最后编写一个测试类,用于测试公交车三类卡的刷卡操作。 package first; public class CardTest { public static void main(String[] args... 阅读详情

相关推荐

泛微E9开发 明细表字段赋值到主表字段,将各类型合计赋值到主表类型合计中

①绑定明细表类型、预计金额字段的值改变事件,每当有值发生改变,就需要重新计算供应商1、供应商2、供应商3的合计,如果不绑定这两个字段的话,会出现计算不及时或计算错误的问题。②当有明细行被删除时,也需要重新计算供应商1、供应商2、供应商3的合计,比如删除了供应商1的明细行,如果不重新计算,那么供应商1的值还是被删之前的值,合计错误。将各类型合计赋值到主表类型合计中。

a_waste_only的博客 3834

JavaScript 继承(六)原型二

不好意思因为懒,,我懒得弄图,,就是代码+注释 //首先 我们明白变量屏蔽 简单来说就是局部变量屏蔽全局变量 //这事就不废话了。。 //那么 如果 一个对象本身有 a 属性 他的prototype上也有会怎么样呢? //用代码说话 function Foo(){ this.a = 0; Foo.prototype.a = 1; } var foo = new Foo(); console.log(foo.a); //0 //由此可见 本身的属性会屏蔽 prototype上的属性 v

SeriousSnow的博客 186

碳酸钙岩石酸蚀酸溶COMSOL建模:非均质对酸蚀通道的影响

多孔介质中的流动与化学反应耦合是石油工程和地下资源开发中的核心问题,酸液与岩石矿物的溶蚀过程直接关系到酸化增产效果。在碳酸盐岩储层中,盐酸与方解石的反应速率极快,酸液会优先沿高渗透区域推进,形成指状酸蚀通道,即wormhole。传统均质模型难以描述这种局部溶蚀行为,而数值模拟工具COMSOL通过耦合达西定律、稀物质传递与孔隙度演化方程,能够定量刻画酸蚀路径与渗透率的变化规律。工程实践中,模拟结果可用于预测酸液突破体积、优化注入排量,并为基质酸化方案设计提供依据。本文围绕碳酸钙岩石酸蚀酸溶COMSOL模型,探

weixin_29009401的博客 326

JAVA笔记六:继承(二)

虽然构造的list的容量为10,初始时size为0,add追加1个元素后list.size()=1,最终size值为17,即list中有17个元素。int compareTo(E other):如果枚举类出现在other之前,返回一个负整数,若this==other,返回0,否则返回一个正整数。使用Java中的另一个类,名为ArraysList,其类似与数组,但在添加或删除元素时,它能够自动的调整数组容量。包装器类是不可改变的,即一旦构造的包装器,就不允许更改包装在其中的值。//返回字符串“SMALL”

m0_61598337的博客 140

别再只盯着照片了!手把手教你用Python提取大疆照片里的GPS、姿态和RTK数据

本文详细介绍了如何使用Python提取大疆照片中的GPS、姿态和RTK数据,帮助用户解锁无人机拍摄照片中的隐藏元数据。通过实战代码示例,展示了如何解析EXIF格式的定位、姿态和RTK状态信息,并实现批量处理与数据分析,适用于测绘、农业巡检等专业领域。

weixin_30790841的博客 150

绿联UGOS Pro系统虚拟机部署Windows 11详细教程(跳账户登录,安装内存驱动)

总的来说,此次的虚拟机部署Windows 11出现的问题应该是目前几乎所有虚拟机都可能出现的问题,和绿联是没有关系的。所以说如果你在其它NAS上虚拟机部署Windows 11系统如果出现同样的问题,那么今天教程的方案也同样适用于你。

qq_63499861的博客 1万+

Java清览题库实验 (实验二 ~ 实验六)

实验二 基本数据类型、控制语句的应用 (5) 两个数之间的经典问题 谷值 找出n以内的所有"孪生数". 完数 完数(三个) 实验三 类与对象 (3) 机动车 家中的电视 共饮同井水 实验四 继承与接口 (6) 中国人、北京人和美国人 银行计算利息 公司支出的总薪水 评价成绩 货车的装载量 小狗的状态 实验五 内部类与异常类 (1) 检查危险品 实验六 常用实用类 (6) 截取字符串 子串出现频率 统计指定字符的次数 使用Scanner类 替换错别字 处理大整数

qq_43339789的博客 4902

高质量文献综述原来这么写!借助Gemini 3 Pro+四步法,手把手教你写出有逻辑深度的综述

总结与展望先总结现状,说明前人已经做到什么地步了,再指出缺口,前人没解决什么问题、方法有什么局限等等,最后再在这个缺口的基础上,提出你的未来研究方向。当你有个复杂的研究题目,但没办法拆解出关键词,就可以让Gemini 3 Pro来辅助帮你拆解,并帮你写专业的检索式,若是找英文文献,还能帮你将中文关键词翻译成地道的专业术语。做文献笔记,可以建立文献笔记矩阵,可以用Excel建个表格,横向是文献,纵向是关键要素,包括作者/年份、研究问题/假设、理论框架/模型、研究方法/数据来源、核心结论、局限性/Gap。

智能AI让学术科研更容易 989

C++类的继承(二)一文吃透继承

大家好,这里是小张,今天继续给大家带来**类的继承**,上一次我们说到了什么叫做继承,和继承的一些语法,今天就由小张来继续给大家讲解一下继承的三种方式,继承中的对象模型以及继承中的构造函数和析构函数的顺序,在此希望能够帮助到大家更好的理解类的继承。 首先我们先来看继承的三种方式,继承分为公共继承,保护继承以及私有继承,父类中的私有属性在子类中谁也访问不到,如果是公共继承,父类的公共属性在子类中仍是公共属性,父类的保护属性在子类依然是保护属性,私有还是私有,如果是保护继承,父......

weixin_64067830的博客 5万+

基于潜在空间分数匹配的混合型表格数据合成方法

然而,在我们的模型中,β 预计会更小,因为我们不需要嵌入的分布精确地遵循标准高斯分布,因为我们还有一个额外的扩散模型。受 Transformer 在表格数据分类/回归任务中取得成功的启发,我们首先为每一列学习一个独特的标记器,然后将标记(列)级表示输入到 Transformer 中,以捕捉列之间错综复杂的关系。在第 4 节中,我们证明了通过这种设计,TABSYN 可以在不到 20 次函数评估(NFE)的情况下生成高质量的合成表格数据,这比其他基于扩散的表格数据合成方法要少得多。是标记器的可学习参数。

步子哥的博客 853

华为OD机试 - 整型数组按照个位数排序(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。给定一个非空数组(列表),其元素数据类型为整型,请按照数组元素十进制最低位从小到大进行排序,十进制最低位相同的元素,相对位置保持不变。当数组元素为负值时,十进制最低位等同于去除符号位后对应十进制值最低位。给定一个非空数组,其元素数据类型为32位有

学Java,找哪吒 398

C++中的继承(二)

上一篇文章我们C++的正常继承其实已经讲完了,但是后面还有一个大坑。实际当中继承有单继承和多继承。单继承就是直接继承一个类。只有一个直接父类的就叫做单继承。如果是单继承那就比较简单。现实世界除了有单继承还有多继承。

庖丁解牛,恢恢乎游刃有余 3740

Python3实现基于ARIMA模型来预测茅台股票价格趋势

ARIMA(Autoregressive Integrated Moving Average)模型是一种广泛使用的时间序列分析方法,它可以用于对未来的数据进行预测。ARIMA模型由自回归模型(AR模型)、差分整合模型(I模型)和移动平均模型(MA模型)组成,因此也被称为ARIMA(p,d,q)模型。其中,p表示自回归阶数,d表示差分阶数,q表示移动平均阶数。具体来说,ARIMA模型可以通过以下步骤进行建模:数据预处理:对时间序列进行平稳性检验,如果不满足平稳性,则进行差分操作。

m0_64336780的博客 2万+

六、继承(三)

之前我们说过,初始化列表初始化的顺序跟出现的顺序无关,而跟声明的顺序有关,也就是说谁先声明谁先初始化,而对于继承也有类似的特性,谁先被继承谁就先声明。,此时数据冗余的影响并不大,而当继承的成员有很多时,通过存放一个指向虚基表的指针再通过偏移量来得到公有的对象就可以极大地节省空间了。实际上,这个地方空下来是为多态做准备,这里我们暂且不表,我们现在需要知道的是,这里不只是用来存偏移量,还会用来存别的数据。为了解决菱形继承的二义性和数据冗余的问题,C++又引入了虚拟继承的概念,而要使用虚拟继承,就要用到关键字。

HackerKevon的博客 1179

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

六、继承(一)

继承的引入//继承的概念及定义//继承的定义格式//继承关系和访问限定符//继承基类成员访问方式的变化//基类和派生类对象赋值转换//基类和派生类对象赋值转换引入//基类和派生类对象赋值转换的规则//继承中的作用域//派生类的默认成员函数

HackerKevon的博客 1099

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

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

【Java初阶(六)上】封装 继承 多态

掌握封装的概念,如何实现封装,包的概念,继承的概念,为什么要继承,继承的相关语法,子类构造方法等等。

weixin_69049913的博客 2665

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【C++】继承(二)多继承,虚函数,虚继承

1.单继承与多继承 2.菱形继承 3.虚继承---解决菱形继承的二义性和数据冗余的问题 4.虚函数与多态 5.继承体系同名函数的关系   1.单继承与多继承  1.1单继承:       一个子类只有一个直接父类。   class Person class Student : public Person class Monitor : public Student  1.2多继...

hgelin的博客 7278

实验六 继承和多态

实验六继承和多态 实验目的 1. 掌握接口的使用方法 2. 掌握子类的继承性、子类对象的创建过程 3. 掌握成员变量的继承与隐藏、方法的继承与重写 实验学时 6学时 实验内容 1. 编写程序为公交车的老人卡、学生卡和普通市民卡提供收费功能。将充值、收费功能提取,定义在一个接口中,然后被这三种卡类实现。最后编写一个测试类,用于测试公交车三类卡的刷卡操作。 packagecode61; publicinterfaceBuscard { //定义接口Bus card void...

m0_63689135的博客 1846

C++修炼之路之继承<二>

菱形继承,虚拟继承及原理,组合与继承,静态成员,友元与六大默认函数

Miwll的博客 1509

C++ 继承(二)

我们上面提到过,多继承中,先继承的父类在前面后继承的父类在后面,子类成员放在最后面。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂,性能也会由一些损失,所以最好不要设计出菱形继承。方法1:父类的构造函数私有,子类构成必须调用父类的构造函数,但是父类的构造函数私有后,子类就不能调用了。我们可以看到子类对象中的_name与父类对象中的_name地址不同,而子类对象与父类对象的_count地址是相同的。先继承的父类在前面,后继承的父类在后面,子类成员在最后面,所以p1与p3指向相同。

m0_68142120的博客 1223

【C++面向对象】六、封装、继承和多态

生活中的多态,是指的客观的事物在人脑中的主观体现。例如,在路上看到一只哈士奇,你可以看做是哈士奇,可以看做是狗,也可以看做是动物。主观意识上的类别,与客观存在的事物,存在is a的关系的时候,即形成了多态。在程序中,一个类的引用指向另外一个类的对象,从而产生多种形态。当二者存在直接或者间接的继承关系时,父类引用指向子类的对象,即形成多态。多态是面向对象三大特性之一,记住继承是多态的前提,如果类与类之间没有继承关系,也不会存在多态。

咖喱年糕的博客 1388

Kotlin学习之路(六):继承

Kotlin学习之路(六):继承

RQ997832的专栏 5851

实验六 继承

实验六 继承一、实验目的二、实验类型及课时三、实验环境四、实验内容 一、实验目的 1.练习类的继承,子类的构造方法。 2. 掌握方法的重写和方法的重载。 3. 掌握this和super的使用。 二、实验类型及课时 验证/设计/综合:验证;课时:2。 三、实验环境 装有JAVA语言工具软件 (Eclipse)的微机若干 四、实验内容 练习知识点: 继承的使用 构造函数的重载 方法的重写 编码实现子类的构造函数的练习: 父类“Person”类, “Teacher”类继承“Person”类。要求: (1

qq_48520823的博客 2391

继承方式六:寄生组合式继承

前面说过,组合继承是JavaScript最常用的继承方式;不过,它也有自己的不足。组合继承最大的问题就是无论什么情况下,都会调用两次超类型构造函数:一次是在创建子类型原型的时候,另一次是在子类型构造函数的内部。没错,子类型最终会包含超类型对象全部的实例属性,但我们不得不在调用子类型构造函数时重写这些属性。再来看一看下面组合继承的例子。 function SuperType(name) { ...

AndrewNeo 3026

C++当中的继承(二)

每一次调用基类的构造函数的时候都会对我们 的静态成员变量进行++操作,这样不论是创建我们的基类对象还是创建我们的派生类对象都会进行统计,我们这个类型的对象个数也就被统计出来了。当我们产生该种继承方式的时候就会出现数据冗余和二义性的问题,因为我们会发现在类B和类C当中都继承了类A,所以我们类A当中的数据自然也就复制了一份到我们的类B和类C当中了,那么派生类D在继承类B和类C的时候又会将类B和类C当中的数据复制一份到我们的类D当中。所谓的虚继承就是专门应对我们菱形继承所带来的问题所引入的概念。

lmbuhuiku的博客 1136

C++继承(二)

友元关系不能被继承,也就是说基类友元不能访问子类私有保护成员基类Person有一个友元函数Display,可以访问基类的私有成员,需要注意的是函数有Student类但是这个类在后面,所以需要前置声明告诉编译器有这个东西,后面打印p._name是没问题的,但是打印stuNum就不行了,因为派生类不会继承基类的友元函数,基类的友元函数不能访问派生类的私有成员。

2302_80378107的博客 1236
上一篇: 【上海大学计算机组成原理实验报告】七、程序转移机制
下一篇: 六、继承(三)
Kutbas
博客等级 码龄7年 737粉丝 55原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kutbas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值