C++继承相关内容(二)

news2024/11/25 4:33:17

目录

一.拷贝构造函数

第一种情况:基类没有拷贝构造函数,派生类也没有拷贝构造函数

结果:

原因:

 第二种情况:基类没有拷贝构造函数,派生类有拷贝构造函数

 结果:

 原因:

  第三种情况:基类有拷贝构造函数,派生类没有拷贝构造函数

 结果:

 原因:

第四种情况:基类有拷贝构造函数,派生类有拷贝构造函数

 结果:

二.赋值重载

三. 静态成员

 结果:

原因:


一.拷贝构造函数

第一种情况:基类没有拷贝构造函数,派生类也没有拷贝构造函数

class Person {
private:
	int _id;
public:
	Person() :_id(0) { cout << "Create Person()" << endl; }
	Person(int id) :_id(id) { cout << "Create Person(int)" << endl; }
	~Person()  { cout << "Destory Person()" << endl; }
	void PrintPersonInfo()const { cout << "id: " << _id << endl; }
};
class Student :public Person {
private:
	int _sid;
public:
	Student() :_sid(0) { cout << "Create Student" << endl; }
	Student(int id,int sd) :Person(id), _sid(sd) { cout << "Create Student(int int)" << endl; }
	~Student() { cout << "Destory Student" << endl; }
	void PrintStudentInfo()const { 
		PrintPersonInfo();
		cout << "sid: " << _sid << endl; 
	}
};
int main() {
	Student s1(12345,6789);
	s1.PrintStudentInfo();
	Student s2(s1);
	s2.PrintStudentInfo();
}

结果:

原因:

当两者都没有拷贝构造函数时,是按照按位拷贝的方式,用两个指针分别指向s1和s2,将s1的数据一字节一字节拷贝给s2

 第二种情况:基类没有拷贝构造函数,派生类有拷贝构造函数

class Person {
private:
	int _id;
public:
	Person() :_id(0) { cout << "Create Person()" << endl; }
	Person(int id) :_id(id) { cout << "Create Person(int)" << endl; }
	~Person()  { cout << "Destory Person()" << endl; }
	void PrintPersonInfo()const { cout << "id: " << _id << endl; }
};
class Student :public Person {
private:
	int _sid;
public:
	Student() :_sid(0) { cout << "Create Student" << endl; }
	Student(int id,int sd) :Person(id), _sid(sd) { cout << "Create Student(int int)" << endl; }
	~Student() { cout << "Destory Student" << endl; }
	Student(const Student& st) :_sid(st._sid) {
		cout << "Copy Create Student" << endl;
	}
	void PrintStudentInfo()const { 
		PrintPersonInfo();
		cout << "sid: " << _sid << endl; 
	}
};
int main() {
	Student s1(12345,6789);
	s1.PrintStudentInfo();
	Student s2(s1);
	s2.PrintStudentInfo();
}

 结果:

 原因:

系统在调用派生类的拷贝构造的时候,会先去构建父类,这个我们在上一节说过,因为这里并没有明确派生类中Person这个不具名对象的值,所以调用了Person父类中的空参构造,因此此时值为0;

如果我们此时明确指出Person的值与student中的值是一致的,那么就可以实现。这里用到了赋值兼容原则,有不明白的可以查看上次博客

Student(const Student& st) :Person(st),_sid(st._sid) {
		cout << "Copy Create Student" << endl;
	}

  第三种情况:基类有拷贝构造函数,派生类没有拷贝构造函数

class Person {
private:
	int _id;
public:
	Person() :_id(0) { cout << "Create Person()" << endl; }
	Person(int id) :_id(id) { cout << "Create Person(int)" << endl; }
	~Person()  { cout << "Destory Person()" << endl; }
	Person(const Person& pr) : _id(pr._id) {
		cout << "Copy Create Person" << endl;
	}
	void PrintPersonInfo()const { cout << "id: " << _id << endl; }
};
class Student :public Person {
private:
	int _sid;
public:
	Student() :_sid(0) { cout << "Create Student" << endl; }
	Student(int id,int sd) :Person(id), _sid(sd) { cout << "Create Student(int int)" << endl; }
	~Student() { cout << "Destory Student" << endl; }
	void PrintStudentInfo()const { 
		PrintPersonInfo();
		cout << "sid: " << _sid << endl; 
	}
};
int main() {
	Student s1(12345,6789);
	s1.PrintStudentInfo();
	Student s2(s1);
	s2.PrintStudentInfo();
}

 结果:

 原因:

系统在调用Student的拷贝构造时发现不存在,会默认的给出一个拷贝构造函数,这个函数里可以调用父类的拷贝构造函数,因此是可以的

第四种情况:基类有拷贝构造函数,派生类有拷贝构造函数

这里我们必须明确在派生类的构造函数中指出派生类中的不具名对象的值等于所引用的值,会出现切片现

class Person {
private:
	int _id;
public:
	Person() :_id(0) { cout << "Create Person()" << endl; }
	Person(int id) :_id(id) { cout << "Create Person(int)" << endl; }
	~Person()  { cout << "Destory Person()" << endl; }
	Person(const Person& pr) : _id(pr._id) {
		cout << "Copy Create Person" << endl;
	}
	void PrintPersonInfo()const { cout << "id: " << _id << endl; }
};
class Student :public Person {
private:
	int _sid;
public:
	Student() :_sid(0) { cout << "Create Student" << endl; }
	Student(int id,int sd) :Person(id), _sid(sd) { cout << "Create Student(int int)" << endl; }
	~Student() { cout << "Destory Student" << endl; }
	Student(const Student& st) :Person(st),_sid(st._sid) {
		cout << "Copy Create Student" << endl;
	}
	void PrintStudentInfo()const { 
		PrintPersonInfo();
		cout << "sid: " << _sid << endl; 

	}

};
int main() {
	Student s1(12345,6789);
	s1.PrintStudentInfo();
	Student s2(s1);
	s2.PrintStudentInfo();
}

 结果:

二.赋值重载

赋值重载的情况和拷贝构造是一样的,这里就不展开说了。

注意两点:如果两个类都没有赋值语句,就会按位赋值。必须指明不具名对象的值。

class Person {
private:
	int _id;
public:
	Person() :_id(0) { cout << "Create Person()" << endl; }
	Person(int id) :_id(id) { cout << "Create Person(int)" << endl; }
	~Person()  { cout << "Destory Person()" << endl; }
	Person(const Person& pr) : _id(pr._id) {
		cout << "Copy Create Person" << endl;
	}
	Person& operator=(const Person& pr) {
		if(this!=&pr){
			_id = pr._id;
		}
		cout << "Person::operator=" << endl;
		return *this;
	}
	void PrintPersonInfo()const { cout << "id: " << _id << endl; }
};
class Student :public Person {
private:
	int _sid;
public:
	Student() :_sid(0) { cout << "Create Student" << endl; }
	Student(int id,int sd) :Person(id), _sid(sd) { cout << "Create Student(int int)" << endl; }
	~Student() { cout << "Destory Student" << endl; }
	Student(const Student& st) :Person(st),_sid(st._sid) {
		cout << "Copy Create Student" << endl;
	}
	Student& operator=(const Student& st) {
		if (this != &st) {
			Person::operator=(st);
			this->_sid = st._sid;
		}
		cout << "Student::operator=" << endl;
		return *this;
	}
	void PrintStudentInfo()const { 
		PrintPersonInfo();
		cout << "sid: " << _sid << endl; 
	}
};
int main() {
	Student s1(12345,6789);
	s1.PrintStudentInfo();
	Student s3;
    s3=s1;
	s3.PrintStudentInfo();
}

三. 静态成员

class O {
private:
	int value;
protected:
	static int num;
public:
	O(int x = 0) :value(x) {

	}
	~O() {

	}
};
int O::num = 0;
class B :public O {
public :
	B() {
		cout << "create B: " << ++num << endl;
	}
	~B() {
		cout << "Destory B: " << --num << endl;
	}
};
class T:public O{
public:
	T() {
		cout << "create : " << ++num << endl;
	}
	~T() {
		cout << "Destory : " << --num << endl;
	}
};
int main() {
	T t[2];
	B b[3];
	return 0;
}

 结果:

原因:

基类中的静态成员被所有派生类所共享,只有一份

如果你想使打印效果为T:1,2  B: 1,2,3 可以考虑类模板

本期就更到这里,谢谢各位宝子阅读。

 

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

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

相关文章

【文生图系列】 Stable Diffusion v2复现教程

文章目录 xformersbug 记录 txt2imgdiffusers参考 基础环境承接Stable Diffusion v1, 详情请见我的博文【文生图系列】 Stable Diffusion v1复现教程。然后更新pytorch和torchvision的版本&#xff0c;因为要使用GPU和xformers&#xff0c;需要下载gpu版本的pytorch。再下载ope…

学习笔记之微服务(一)

一、了解微服务 1、服务架构演变 **单体架构&#xff1a;**所有业务功能都集中在一个项目中开发&#xff0c;打成一个包部署。 优点&#xff1a;架构简单、部署成本低 缺点&#xff1a;耦合度高 分布式架构&#xff1a;根据业务拆分系统功能&#xff0c;每个业务模块独立项…

微信小程序map 之个性化地图(日出日落主题)

微信小程序map 之个性化地图&#xff08;日出日落主题&#xff09; 个性化地图之根据日出日落时间动态变换地图主题个性化前的准备进入腾讯地址服务官网小程序开发html 代码. layer-style 编号为样式名称js代码. 注意的是&#xff0c;layer-style只能定义一次&#xff0c;所以值…

Yarn【常用命令】

1、yarn application 查看Application运行情况 1.1、列出所有Application yarn application -list 可以通过Web UI端来查看&#xff1a; 1.2、根据Application状态过滤&#xff1a; yarn application -list -appStates &#xff08;所有状态&#xff1a; ALL 、 NEW 、 NEW…

Spring Cloud Alibaba 同时兼容dubbo与openfeign

一、前言 dubbo与springcloud都可以单独作为微服务治理框架在生产中进行使用&#xff0c;但使用过springcloud的同学大概了解到&#xff0c;springcloud生态的相关组件这些年已经逐步停更&#xff0c;这就导致在服务架构演进过程中的迭代断层&#xff0c;以至于一些新的技术组…

聚合/组合

谨慎使用继承的方式来进行扩展&#xff0c;优先使用聚合/组合的方式来实现。 Father类里有两个方法A和方法B&#xff0c;并且A调用了B。子类Son重写了方法B&#xff0c;这时候如果子类调用继承来的方法A&#xff0c;那么方法A调用的就不再是Father.B()&#xff0c;而是子类中的…

使用kali里的dnschef进行DNS欺骗

1. 前言 DNSChef是针对渗透测试人员和恶意软件分析师的高度可配置的DNS代理。它能够精细配置哪些DNS回复以修改或简单地代理真实响应。为了利用该工具&#xff0c;您必须手动配置DNS服务器以指向DNSChef。 2. 执行参数 选项参数&#xff1a; -h,--help显示帮助信息并退出--f…

C语言:计算 1! + 2! + 3! + ... + n!

题目&#xff1a; 从键盘输入一个值n&#xff0c;计算 1的阶乘 至 n的阶乘 的和&#xff0c; 如&#xff1a;输入10&#xff0c;计算 1的阶乘 至 n的阶乘 的和 --> 计算&#xff1a;1! 2! 3! ... 10! 思路一&#xff1a; 效率比较低&#xff0c;会重复计算之前计算过的…

Stable Diffusion 从听说到超神日记

1.安装模型&#xff08;B站搜秋叶&#xff09; 2.下载模型&#xff0c;安装好的界面有模型下载 有了上面模型已经可以根据模型风格去生成一些照片了 3.使用Additional Networks/lora模型 模型大多都是继承了很多网友自行训练的图库模型&#xff0c;各类风格都有&#xff01; …

分享一个卡通人物

这几天较忙&#xff0c;像它一样&#xff1a; 代码在这里&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>卡通打字</title><script src"https://s3-us-west-2.amazonaws…

《MySQL(五):基础篇- 多表查询》

文章目录 5. 多表查询5.1 多表关系5.1.1 一对多5.1.2 多对多5.1.3 一对一 5.2 多表查询概述5.2.1 数据准备5.2.2 概述5.2.3 分类 5.3 内连接5.4 外连接5.5 自连接5.5.1 自连接查询5.5.2 联合查询5.6.2 标量子查询5.6.3 列子查询5.6.5 表子查询 5.7 多表查询案例 5. 多表查询 我…

【Sql】根据字段分组排序,取其第一条数据

【Sql】根据字段分组排序&#xff0c;取组内第一条数据 【一】问题描述【二】解决方案&#xff08;oracle和mysql都可用&#xff09;【三】总结 【一】问题描述 &#xff08;1&#xff09;问题描述 有时候我们需要对数据进行去重处理&#xff0c;例如查询结果里的文件名有重复…

常用模拟低通滤波器的设计——契比雪夫I型滤波器

目录 常用模拟低通滤波器的设计——契比雪夫I型滤波器 1、cheb1ap 函数 2、cheb1ord 函数 3、cheby1函数 4、实例演示 常用模拟低通滤波器的设计——契比雪夫I型滤波器 巴特沃斯滤波器的频率特性曲线在通带和阻带内&#xff0c;幅度特性是单调下降的&#xff0c;如果阶次一…

RISC-V体系结构的U-Boot引导过程

RISC-V体系结构的U-Boot引导过程 flyfish BootLoader Boot是Bootstrap&#xff08;鞋带&#xff09;的缩写&#xff0c;它来自于一句谚语&#xff1a;“Pull oneself up by one’s own bootstraps”&#xff0c;直译的意思是“拽着鞋带把自己拉起来” 干这件事&#xff0c;得…

文心一言 VS 讯飞星火 VS chatgpt (33)-- 算法导论5.2 5题

五、设A[1…n]是由n个不同数构成的数列。如果i<j且A[i]>A[j]&#xff0c;则称(i&#xff0c;j)对为A的一个逆序对(inversion)。(参看思考题2-4 中更多关于逆序对的例子。)假设A的元素构成(1&#xff0c;2&#xff0c;… &#xff0c;n)上的一个均匀随机排列。请用指示器随…

Win11配置Anaconda-Cuda-Pytorch-Tenserflow环境

之前搞了一个月左右时间用WSL2跑模型&#xff0c;后来发现还是不太习惯&#xff08;其实用不明白&#xff09;&#xff0c;就转成Windows了。这次也是记录一下自己配环境的过程&#xff0c;以免下次还需要 安装Anaconda 下载方式 Anaconda官网清华镜像下载 tip&#xff1a;…

OpenHarmony源码解析(11): hiview维测平台

作者: 鸿湖万联(武汉) 许文龙 1、概述 Hiview是一个跨平台的终端设备维测服务集,由插件管理平台和基于平台上运行的服务插件来构成整套系统。Hiview维测服务是由HiSysEvent事件驱动的,其核心为分布在系统各处的HiSysEvent桩点,格式化的事件会通过HiSysEvent打点API上报至H…

Tomcat【尚硅谷】

一、Tomcat基础 1、常见的web服务器 概念 服务器&#xff1a;安装了服务器软件的计算机服务器软件&#xff1a;接收用户的请求&#xff0c;处理请求&#xff0c;做出响应web服务器软件&#xff1a;在web服务器软件中&#xff0c;可以部署web项目&#xff0c;让浏览器来访问这…

【模块系列】DHT11时序理论

前言 基于stm32f103C6T6核心板STM32CubeMX的DHT11的使用。其实吧&#xff0c;要不是网上关于stm32调用DHT11的代码大多数用不了或者乱七八糟的&#xff0c;我也不想推时序的&#xff0c;嘎嘎麻烦。写着写着就发现&#xff0c;本章的篇幅有点长了&#xff0c;所以本文就先介绍DH…

Fiddler抓包返回的Response中总是出现“Response body is encoded. Click to decode. “的解决办法

在进行网页开发和接口调试时&#xff0c;我们经常会用到Fiddler这个工具。 但是&#xff0c;有时候我们会遇到一个非常头疼的问题&#xff0c;就是在抓取网页返回的Response时总是出现“Response body is encoded. Click to decode.”的提示。 这种情况下我们可能无法正常查看…