波奇学C++:继承

news2024/12/26 3:15:32

继承是为了复用代码,成员的变量或者成员函数

class Person
{
public:
	
protected:
	string _name="li";
	int _age=1;
};
class Student :public Person
{
public:
	void print()
	{
		cout << _age;
	}
protected:
	int _stuid=2;
};

子类student公有继承基类Person,子类,继承Person所有成员变量,相当于copy一份,成员函数在公有,但子类可以访问。

子类的访问受到继承方式和父类访问限定符的影响

父类的public父类的protected父类的private
public子类public子类的protected子类private
protect子类protected子类protected子类private
private不可见不可见不可见

不可见指的是类外都不能访问,private相比,至少类中可以访问。

实际上子类的访问=min(父类的访问限定符,继承方式)

protected 用于存放可以私有且子类可以访问。

不加继承方式,class默认私有继承,struct默认公有继承。

父类不能直接赋值子类(向下转换),子类可以给父类(向上转换),这是一种赋值兼容,把子类中父类的部分切割赋值给父类,而不是强制类型转换

student=person;//报错 
person=student;

子类重定义/隐藏父类成员

子类和父类同名成员变量,成员函数,编辑器优先选择子类,通过父类域可以选择父类的变量,函数,编译器优先顺序:作用域>类域>全局域。

class Student:public Person
........
void Print()
{
cout<< num;
cout<< Person::num;
}

*注意不是重载关系,因为重载要在同一个作用域,而子类和父类分别为两个类域。

派生类的构造,拷贝构造,赋值重载

//基类
class Person
{
public:
	Person(const char* name = "peter")
		: _name(name)
	{
		cout << "Person()" << endl;
	}
	Person(const Person& p)
		: _name(p._name)
	{
		cout << "Person(const Person& p)" << endl;
	}
	Person& operator=(const Person& p)
	{
		cout << "Person operator=(const Person& p)"<< endl;
		if (this != &p)
		{
			_name = p._name;
		}
		return *this;
	}
	~Person()
	{
		cout << "~Person()" << endl;
	}
protected:
	string _name;
};
//子类
class Student :public Person
{
public:
	Student()
		:_id(0)
	{

	}
protected:
	int _id;
};

子类Student继承了父类Person,继承相当于copy了一份父类的成员变量,因此我们理解子类中有_name和_id两个变量。但不能在初始化列表中初始化_name,但可以在函数内部中。

初始化列表相当于在定义时初始化,可以理解为编译器在基类的定义找不到父类中的_name声明。

实际上继承的父类的成员变量,在初始化列表,默认调用父类构造函数来初始化。

// 子类构造函数
Student()
		:_id(0)
		,Person("xiaoli")
	{
		_name="xixiaong"
	}

注意Person的初始化优先于,_id的初始化

理解成父类成员变量的声明先于子类成员变量。

派生类的拷贝构造

Student(const Student& s)
		:Person(s)
		,_id(s._id)
{

}

用父类的拷贝构造,子类作为参数,拷贝构造父类的成员变量,我们此前所说的向上转换,子类给父类是指出的,再拷贝构造基类自身成员变量。

如果不显示调用拷贝构造,会调用默认构造。

派生类的赋值重载,除了子类向上构造,还有注意operator=()重定义的问题。

Student& operator=(const Student& s)
{
	if (this != &s)
	{
		Person::operator=(s);
		_id = s._id;
	}
	return *this;
}

析构函数不用显式调用父类析构函数

析构函数名被特殊处理destructor,在子类析构调用后,会自动调用父类析构函数。来保证先子后父

~Student()
	{

	}

先子后父的原因:初始化列表时,先调用父类构造函数,所以结束时后调用父类析构函数。子类可能用到父类的函数,成员变量,如果父类被析构了,那么就会报错

友元关系不能继承。

静态成员变量属于子父类公有,子父类的静态成员变量是共有的,而不是复制的关系

class Person
......
protected:
	string _name;
	static int _count;
};
int Person::_count = 0;

多继承和菱形继承

Assiatant类继承了Student和Teacher两个类

class Assistant :public Student, public Teacher
{
protected:
	string _majorCourse;
};

 菱形继承存在的问题,student可能和teacher同时从Person那里继承了age,使得assistant类中有两个年龄造成数据冗余和二义性

 虚继承解决冗余,二义性问题

// Student和Teacheer类虚继承了Person
class Student :virtual public Person
{
protected:
	int  _num;
};
class Teacher :virtual public Person
{
protected:
	int _id;
};

二义性的证明

class A
{
public:
	int _a;
};
class B : public A
{
public: int _b;
};
class C : public A
{
public: int _c;
};
class D : public C, public B
{
public: int _d;
};

由图可得_a有两个分别在B,C中。并且类A,B,C的变量依次排列

虚继承virtual

 _a 的位置存放着一串地址

对应地址的下个位置的数值为20,12,恰好就是B,C到A的偏移量。

本质上保存的是_a的相对位置,那么为什么不直接保存A的地址,或者偏移量而是要保存指向一块空间的地址?如果存在多个D对象,因为相对位置是固定的,所以可以直接复用。d2 和d1的绝对地址是不一样的,但是相对位置是一样的。

右边的表又叫为虚基表,专门保存偏移量。

总结:把它单独划分出来便于复用。

虚继承后B,C,D 都报错相似的结构,有虚基表

 偏移量的运用

当ptr无论指向B 还是C 都可以通过偏移量,找到A

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/979527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可视化工具Datart踩(避)坑指南(1)——不可复用的图表

作为目前国内开源版本最好用的可视化工具&#xff0c;Datart无疑是低成本高效率可供二开的可视化神兵利器。当然&#xff0c;免费的必然要付出一些踩坑的代价。本篇我们来讲一讲可视化工具Datart踩&#xff08;避&#xff09;坑指南&#xff08;1&#xff09;——不可复用的图表…

【小吉测评】高效简洁的数据库管控平台—CloudQuery

文章目录 &#x1f384;CloudQuery是什么&#x1f6f8;CloudQuery支持的数据源类型&#x1f354;CloudQuery社区地址&#x1f33a;如何使用&#x1f6f8;参考官方文档&#x1f6f8;参考视频教程&#x1f388;点击免费下载&#x1f388;立即下载即可&#x1f388;使用服务器完成…

基于Mendix移动原生的离线应用

一、前言 不同行业的企业会有特殊的业务场景&#xff0c;比如某些制造业的企业的工厂是物理隔离的&#xff0c;但工程师需要拿着平板输入很多生产数据&#xff1b;某些煤炭和矿业企业&#xff0c;在实际的工作区都是比较偏远&#xff0c;信号比较差&#xff0c;但是又需要用手…

gt基础教程

每日练习 吉他-结构 吉他-品 吉他谱 六线谱 调音器 试炼导航 每日练习 流程1&#xff1a; 右手拨弦: 大拇指单独练习 控制654弦&#xff0c;每根弦拨4下 6弦4下 5弦4下 4弦4下食指无名指练习 控制321弦&#xff0c;321、321练习&#xff0c; 然后321、123练习&#xff0…

指令系统(408)

一、拓展操作码指令格式 【2017 统考】某计算机按字节编址&#xff0c;指令字长固定且只有两种指令格式&#xff0c;其中三地址指令29条、二地址指令107条&#xff0c;每个地址字段6位&#xff0c;则指令字长至少应该是&#xff08; A&#xff09; A、24位 B、26位 …

离散型行业与MES系统——密不可分的关系

离散型行业通常指的是制造业中的一类&#xff0c;其中产品制造过程是通过离散的步骤和阶段完成的&#xff0c;而不是连续不断的过程。这些离散型行业包括汽车制造、电子制造、航空航天、医药制造、机械制造等。在这些行业中&#xff0c;产品通常是由不同的零部件和组件组装而成…

DM8 安装手册(官方原版包含卸载)

DM8 安装手册 一 .安装简介1.1 DM 产品的构成DM Standard Edition 标准版DM Enterprise Edition 企业版DM Security Edition 安全版 DM 产品主要由数据库服务器和客户端程序两大部分组成。其中数据库服务器包括多种操作系统下的版本&#xff0c;主要有&#xff1a;DM 客户端程序…

TikTok美国市场现状如何?

众所周知&#xff0c;我国是世界上人口最多的国家&#xff0c;近年来经济水平也迅速提高&#xff0c;因此消费水平自然较高。但是实际上消费水平最高的国家是美国&#xff0c;人口仅超过3亿。目前在这个跨境电商人人都想尝试的时代&#xff0c;美国这个国家更是成为了跨境电商卖…

typeof 在TypeScript中和JavaScript中的区别

前言 在TypeScript中和JavaScript中都有typeOf&#xff0c;但是作用用法却大有不同。 js的typeof 一、typeof用来判断数据类型返回结果&#xff1a; 基本数据类型&#xff1a;string&#xff0c;number&#xff0c;boolean,undefined 引用数据类型&#xff1a;object …

yocto stm32mp1集成ros

yocto stm32mp1集成ros yocto集成ros下载meta-rosyocto集成rosrootfs验证 yocto集成ros 本章节介绍yocto如何集成ros系统用来作机器人开发。 下载meta-ros 第一步首先需要下载meta-ros layer&#xff0c;meta-ros的链接如下&#xff1a;https://github.com/ros/meta-ros/tre…

环信uni-app-demo 升级改造计划——单人多人音视频通话(三)

前序文章&#xff1a; 环信 uni-app Demo升级改造计划——Vue2迁移到Vue3&#xff08;一&#xff09; 环信即时通讯SDK集成——环信 uni-app-demo 升级改造计划——整体代码重构优化&#xff08;二&#xff09; 概述 在将声网 uni-app 音视频插件正式集成进入环信的 uni-app…

毫米波水位监测仪:实时监测水体水位变化

水位监测是一项关键的技术&#xff0c;用于实时监测水体的水位变化&#xff0c;对于水利工程、自然灾害预防和水资源管理都具有重要的意义。通过在各关键节点安装毫米波水位监测仪&#xff0c;可对水位情况进行实时监测&#xff1b;当水位超过阈值时&#xff0c;智能监测仪器将…

一份超预期的期中成绩,拨开百果园“高价值迷雾”

文 | 螳螂观察 作者 | 青月 步入2023年&#xff0c;经济复苏、消费增长趋势显现&#xff0c;但实体店还未完全突破桎梏。 不过&#xff0c;即使是在这样的市场环境中&#xff0c;年初成功“上岸”&#xff0c;估值一度达百亿的百果园&#xff0c;依旧交出了一份营收净利双增…

二蛋赠书一期:《快捷学习Spring》

文章目录 前言活动规则参与方式本期赠书《快捷学习Spring》关于本书作者介绍内容简介读者对象 结语 前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c…

【C++】函数重载 ④ ( 函数指针定义的三种方式 | 直接定义函数指针 | 通过 函数类型 定义 函数指针 | 通过 函数指针类型 定义 函数指针 )

文章目录 一、函数指针定义方法1、直接定义函数指针2、通过 函数类型 定义 函数指针3、通过 函数指针类型 定义 函数指针4、代码示例 - 不同方式定义函数指针 博客总结 : 重载函数 : 使用 相同 的 函数名 , 定义 不同 的 函数参数列表 ;判定标准 : 只有 函数参数 的 个数 / 类…

给抖音达人推商品需要注意什么?抖店商家注意了,教你几个技巧

我是王路飞。 找达人带货这种玩法&#xff0c;虽然商家要给带货达人佣金&#xff0c;相当于你的利润变少了。 但是你要明白一件事&#xff0c;我们做抖店也不是做着玩的&#xff0c;而是奔着长线去玩的&#xff0c;所以长久稳定才是我们需要的。 而相比较自然流量&#xff0…

SecureCRT安装、汉化、上传、美化

文章目录 SecureCRT安装、汉化、美化一、SecureCRT介绍二、SecureCRT下载三、SecureCRT汉化四、SecureCRT连接五、SecureCRT上传第一种方法&#xff1a;用SFTP 传输文件第二种方法&#xff1a;WinSCP传输文件 六、SecureCRT美化 SecureCRT安装、汉化、美化 一、SecureCRT介绍 …

Source Insight 宏-添加单行的c注释

今天写代码的时候突然想到在代码的上一空行添加一对 /* */ 来添加注释&#xff0c;或者单独注释一行代码&#xff0c;而且是用 c 的注释方式&#xff0c;即使用 /**/&#xff0c;如想要在光标处添加 /**/ 或者注释掉光标所在的行&#xff0c;如&#xff1a; 实际的效果就是这样…

小程序开发一个多少钱啊

小程序开发费用 小程序作为一种流行的移动应用形式&#xff0c;具有广阔的市场前景和商业机会。然而&#xff0c;在考虑开发小程序时&#xff0c;了解相关费用是至关重要的。以下是关于小程序开发费用及其相关成本的详细解析&#xff1a; 1. 小程序认证费用&#xff1a; 开发…

【vue】使用无障碍工具条(详细)

引入&#xff1a;使用的是太阳湾的无障碍工具条&#xff0c;代码地址&#xff1a;https://gitee.com/tywAmblyopia/ToolsUI 具体步骤&#xff1a;下载代码后&#xff0c;将其中的 canyou 文件夹拖入 vue 项目中的 public 文件夹中&#xff1b; 上图是在项目目录中的样子&#…