C++ 继承 派生类的拷贝构造

  • 继承
    • 派生类的拷贝构造
    • 构造顺序
    • 拷贝构造
      • 引例1: 当子类,不自实现拷贝构造时,默认调用父类的拷贝构造
      • 引例2: 子类自实现拷贝构造,不做特殊处理时,只会调用父类的构造器.
      • 引例3: 显示的调用父类的拷贝构造器。
      • 案例:
    • 内嵌函数的拷贝构造
      • 引例1 :当内嵌子对象,子类不自实现拷贝构造时,默认调用内嵌子对象的拷贝构造
      • 引例2: 子类自实现的拷贝构造,不做特殊处理,此时只会调用内嵌对象的构造器,此时失去了内嵌对象的拷贝构造的意义
      • 引例3: 显示的调用内嵌对象的拷贝构造器
      • 案例:

继承

派生类的拷贝构造

拷贝构造,也是一种构造函数,也没有被继承下来。

语法:

派生类::派生类(const 派生类& another):基类(another),派生类新成员(another.新成员)
{//派生类新成员(another.新成员)
}

构造顺序

在这里插入图片描述

父类中,一部分成员需要拷贝构造来完成,

子类中,也有一部成员需要拷贝构造来完成。

子类中的内嵌子对象也需要拷贝构造来完成

拷贝构造

引例1: 当子类,不自实现拷贝构造时,默认调用父类的拷贝构造

#include <iostream>
using namespace std;//当子类,不自实现拷贝构造时,默认调用父类的拷贝构造
class A{public:A(){cout << " A ()" << endl;}A(const A& other){cout << " A (const A& other)" << endl;}};class B: public A{
public:B(){cout << " B ()" << endl;}int b;
};int main() {B b;B bb(b);return 0;
}
输出:A ()B ()A (const A& other)

引例2: 子类自实现拷贝构造,不做特殊处理时,只会调用父类的构造器.

#include <iostream>
using namespace std;//子类自实现拷贝构造,不做特殊处理时,只会调用父类的构造器.
class A{public:A(){cout << " A ()" << endl;}A(const A& other){cout << " A (const A& other)" << endl;}};class B: public A{
public:B(){cout << " B ()" << endl;}B(const B& other){cout << " B (const A& other)" << endl;}int b;
};int main() {B b;B bb(b);return 0;
}
输出:A ()B ()A ()B (const A& other)

引例3: 显示的调用父类的拷贝构造器。

#include <iostream>
using namespace std;//当子类,不自实现拷贝构造时,默认调用父类的拷贝构造
//子类自实现拷贝构造,不做特殊处理时,只会调用父类的构造器.
class A{public:A(int x){a=x;cout << " A ()" << endl;}A(const A& other){a=other.a;cout << " A (const A& other)" << endl;}int a;
};class B: public A{
public:B(int x,int b):A(x){this->b=b;cout << " B ()" << endl;}//显示的调用父类的拷贝构造器。     //子类对象赋值给父类引用,赋值兼容B(const B& other):A(other){b=other.b;cout << " B (const A& other)" << endl;}int b;
};int main() {B b(200,100);B bb(b);cout<<b.a<<endl;cout<<b.b<<endl;return 0;
}

案例:

# include <iostream>
using namespace std;class Birthday{
private:int year_;int month_;int day_;public:Birthday(int year=0, int month=0, int day=0): year_(year), month_(month), day_(day){}void Birthdayprint(){cout <<"Birthday:"<< year_ << "/" << month_ << "/" << day_ << endl;}};class Student{
private:Birthday birthday_;string name_;char sex_;float score_;public:Student(string name, char sex, float score , int year, int month, int day): name_(name), sex_(sex), score_(score),birthday_(year, month, day){}Student(const Student& other){cout<<" Student (const Student& other)"<<endl;this->name_ = other.name_;this->sex_ = other.sex_;this->score_ = other.score_;}void print(){cout << "Name: " << name_ << endl;cout << "Sex: " << sex_ << endl;cout << "Score: " << score_ << endl;birthday_.Birthdayprint();}
};class Graduate: public Student{
private:float salary_;public:Graduate(string name, char sex, float score, float salary, int year, int month, int day): Student(name, sex, score, year, month, day), salary_(salary){}Graduate(const Graduate& other):Student(other){cout<<" Graduate (const Graduate& other)"<<endl;this->salary_ = other.salary_;}void pri(){print();cout << "Salary: " << salary_ << endl;}
};class Doctor: public Graduate{
private:string title_;
public:Doctor(string name, char sex, float score, float salary, int year, int month, int day, string title): Graduate(name, sex, score, salary, year, month, day), title_(title){}Doctor(const Doctor& other):Graduate(other){cout << " Doctor (const Doctor& other)" << endl;this->title_ = other.title_;}void Dpri(){pri();cout << "Title: " << title_ << endl;}
};int main(){Graduate g("Alice", 'F', 95.5, 5000 , 2000, 1, 1);g.pri();cout <<"==============="<< endl;Doctor d("Bob", 'M', 85.0, 4000, 2000, 1, 1, "Doctor");d.Dpri();cout <<"==============="<< endl;Doctor d2(d);d2.Dpri();return 0;
}

内嵌函数的拷贝构造

引例1 :当内嵌子对象,子类不自实现拷贝构造时,默认调用内嵌子对象的拷贝构造

#include <iostream>
using namespace std;
//todo 内嵌子对象class C{
public:C(){cout << " C ()" << endl;}C(const C& other){cout << " C (const C& another)" << endl;}};class A{
public:A(int x){a=x;cout << " A ()" << endl;}A(const A& other){a=other.a;cout << " A (const A& other)" << endl;}int a;
};class B: public A{
public:B(int x,int b):A(x){this->b=b;cout << " B ()" << endl;}//当内嵌子对象,子类不自实现拷贝构造时,默认调用内嵌子对象的拷贝构造int b;C c;
};int main() {B b(200,100);B bb(b);return 0;
}
输出:
A ()C ()B ()A (const A& other)C (const C& another)

引例2: 子类自实现的拷贝构造,不做特殊处理,此时只会调用内嵌对象的构造器,此时失去了内嵌对象的拷贝构造的意义


#include <iostream>
using namespace std;
//todo 内嵌子对象class C{
public:C(){cout << " C ()" << endl;}C(const C& other){cout << " C (const C& another)" << endl;}};class A{
public:A(int x){a=x;cout << " A ()" << endl;}A(const A& other){a=other.a;cout << " A (const A& other)" << endl;}int a;
};class B: public A{
public:B(int x,int b):A(x){this->b=b;cout << " B ()" << endl;}//子类自实现的拷贝构造,不做特殊处理,此时只会调用内嵌对象的构造器,此时失去了内嵌对象的拷贝构造的意义B(const B& other):A(other){b=other.b;cout << " B (const A& other)" << endl;}int b;C c;
};int main() {B b(200,100);B bb(b);return 0;
}
输出:A ()C ()B ()A (const A& other)C ()B (const A& other)

引例3: 显示的调用内嵌对象的拷贝构造器


#include <iostream>
using namespace std;
//todo 内嵌子对象class C{
public://当内嵌子对象,C(){cout << " C ()" << endl;}C(const C& other){cout << " C (const C& another)" << endl;}};class A{
public:A(int x){a=x;cout << " A ()" << endl;}A(const A& other){a=other.a;cout << " A (const A& other)" << endl;}int a;
};class B: public A{
public:B(int x,int b):A(x){this->b=b;cout << " B ()" << endl;}//显示调用内嵌子对象的拷贝构造B(const B& other):A(other),c(other.c){b=other.b;cout << " B (const A& other)" << endl;}int b;C c;
};int main() {B b(200,100);B bb(b);return 0;
}
输出:A ()C ()B ()A (const A& other)C (const C& another)B (const A& other)

案例:

# include <iostream>
using namespace std;class Birthday{
private:int year_;int month_;int day_;public:Birthday(int year=0, int month=0, int day=0): year_(year), month_(month), day_(day){}Birthday(const Birthday& other){cout<<" Birthday (const Birthday& other)"<<endl;this->year_ = other.year_;this->month_ = other.month_;this->day_ = other.day_;}void Birthdayprint(){cout <<"Birthday:"<< year_ << "/" << month_ << "/" << day_ << endl;}
};class Student{
private:string name_;char sex_;float score_;Birthday birthday_;
public:Student(string name, char sex, float score , int year, int month, int day): name_(name), sex_(sex), score_(score),birthday_(year, month, day){}Student(const Student& other):birthday_(other.birthday_){cout<<" Student (const Student& other)"<<endl;this->name_ = other.name_;this->sex_ = other.sex_;this->score_ = other.score_;}void print(){birthday_.Birthdayprint();cout << "Name: " << name_ << endl;cout << "Sex: " << sex_ << endl;cout << "Score: " << score_ << endl;}
};class Graduate: public Student{
private:float salary_;
public:Graduate(string name, char sex, float score, float salary, int year, int month, int day):Student(name, sex, score, year,  month,  day), salary_(salary){}Graduate(const Graduate& other):Student(other){cout<<" Graduate (const Graduate& other)"<<endl;this->salary_ = other.salary_;}void pri(){print();cout << "Salary: " << salary_ << endl;}
};class Doctor: public Graduate{
private:string title_;
public:Doctor(string name, char sex, float score, float salary, int year, int month, int day, string title): Graduate(name, sex, score, salary, year, month, day), title_(title){}Doctor(const Doctor& other):Graduate(other){cout << " Doctor (const Doctor& other)" << endl;this->title_ = other.title_;}void Dpri(){pri();cout << "Title: " << title_ << endl;}
};int main(){Graduate g("Alice", 'F', 95.5, 5000 , 2000, 1, 1);g.pri();cout <<"==============="<< endl;Doctor d("Bob", 'M', 85.0, 4000, 2111, 1, 1, "Doctor");d.Dpri();cout <<"==============="<< endl;Doctor d2(d);d2.Dpri();return 0;
}
输出Birthday:2000/1/1
Name: Alice
Sex: F
Score: 95.5
Salary: 5000
===============
Birthday:2111/1/1
Name: Bob
Sex: M
Score: 85
Salary: 4000
Title: Doctor
===============Birthday (const Birthday& other)Student (const Student& other)Graduate (const Graduate& other)Doctor (const Doctor& other)
Birthday:2111/1/1
Name: Bob
Sex: M
Score: 85
Salary: 4000
Title: Doctor

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java】单行注释(//)与多选注释(/* */)

文章目录 单行注释多行注释注意事项 在Java中&#xff0c;注释是用来给代码添加说明的&#xff0c;它不会被编译器执行。Java提供了两种主要的注释方式&#xff1a;单行注释和多行注释&#xff08;有时也称为块注释或块级注释&#xff09;。 单行注释 单行注释以两个正斜杠&…

数模评价决策类—熵权法

目录 文章目录 前言 一、熵权法是什么&#xff1f; 二、基本步骤 计算样本权重及熵权 总结 前言 前面我们学习了层次分析法和Topsis法&#xff0c;这两个方法都是偏主观的方法&#xff0c;这篇我们将运用较为客观的方法——熵权法&#xff0c;做出决策 一、熵权法是什么…

JavaWeb-HTML

一、HTML&CSS&JavaSript的作用: 1.HTML主要用于网页为主体结构的搭建&#xff1b; 2.CSS主要用于页面元素的美化 3.JavaScript主要用于页面元素的动态处理; 二、HTML HTML是Hyper Text Markup Language的缩写。意思是超文本标记语言。它的作用是搭建网页结构&…

2024死磕小红书,一定能赚到钱!

​2024死磕小红书&#xff0c;一定能赚到钱&#xff01;在文末领取小红书运营完全指南电子书 从2023年起&#xff0c;小红书这股热乎劲儿就像开了挂&#xff0c;突然间就成了人人想蹭的“显学”。大伙儿都想趁着平台红利期&#xff0c;分一杯羹。说来惭愧&#xff0c;我从2020年…

牛顿插值法代替泰勒公式

引入 例题 近似函数&#xff1a; 通过这个近似函数可以看出&#xff0c;若要证的函数超过二阶可导&#xff0c;那么就不适合用牛顿插值法代替泰勒公式 因为&#xff0c;后面的操作非常复杂&#xff0c;不划算了… 总结 我们可以通过牛顿插值法生成一个逼近曲线的直线&#xf…

使用Python库开发Markdown编辑器并将内容导出为图片

简介 在本文中&#xff0c;我们将探索如何使用Python的wxPython库开发一个Markdown编辑器应用程序。这个应用程序不仅能浏览和编辑Markdown文件&#xff0c;还可以将编辑的内容导出为PNG图片。 C:\pythoncode\new\markdowneditor.py 完整代码 import wx import markdown2 im…

【传知代码】实体关系抽取(论文复现)

当谈论信息提取领域的最前沿时&#xff0c;实体关系抽取无疑是其中一颗耀眼的明星。从大数据时代的信息海洋中提炼出有意义的关系&#xff0c;不仅是科技进步的体现&#xff0c;更是人类对知识管理和智能决策迫切需求的响应。本文将探索实体关系抽取的核心技术、应用场景及其在…

太阳光模拟器在光纤中的应用

概述 太阳光模拟器是一种重要的实验室设备&#xff0c;它能模拟太阳光的光谱、强度和角度分布&#xff0c;广泛应用于光纤通信、光电器件测试、太阳能研究等多个领域。通过模拟太阳光的光照条件&#xff0c;研究人员可以在实验室环境中对光电材料和器件进行性能测试和研究。 太…

二维码生成原理及解码原理

☝☝☝二维码配图 二维码 二维码&#xff08;Quick Response Code&#xff0c;简称QR码&#xff09;是一种广泛使用的二维条形码技术&#xff0c;由日本公司Denso Wave在1994年开发。二维码能有效地存储和传递信息&#xff0c;广泛应用于商品追溯、支付、广告等多个领域。二维…

c++入门基础(下篇)————引用、inline、nullptr

引用 引用的概念和定义 引⽤不是新定义⼀个变量&#xff0c;⽽是给已存在变量取了⼀个别名&#xff0c;编译器不会为引⽤变量开辟内存空间&#xff0c; 它和它引⽤的变量共⽤同⼀块内存空间。 类型& 引用别名 引用对象; 就像孙悟空也叫齐天大圣 猪八戒也叫天蓬元帅。…

Meinberg Lantime服务器监控指标解读

监控易是一款功能强大的IT基础设施监控软件&#xff0c;它能够实时监控各种IT设备的状态&#xff0c;提供全面的性能分析和告警通知服务。对于Meinberg Lantime服务器&#xff0c;监控易通过一系列监控指标&#xff0c;确保服务器的稳定运行和服务的可用性。 一、监控对象概述…

策略模式的一次应用

项目的需求是将一组图像按照相似度分类。 采用了模板匹配计算相似度的实现方式。 #include <opencv2/core.hpp> #include <openev2/core/utility.hpp> #include <opencv2/highqui.hpp> #include <openav2/imgproc.hpp> cv::Mat image matched; double …

Linux系统编程 --- 动静态库

一、回顾&#xff0c;制作一个库 libXXX.a --- 静态链接 libYYY.so --- 动态链接 设计一个库&#xff1a; 把我们提供的方法&#xff0c;给别人用&#xff1a; 1、把源文件直接给他 2、把我们的源代码打包成库 库 头文件。 原理&#xff1a;把所有的.o文件打包成.a文件也…

llama神经网络的结构,llama-3-8b.layers=32 llama-3-70b.layers=80; 2000汉字举例说明

目录 llama-3-8b.layers=32 llama-3-70b.layers=80 llama神经网络的结构 Llama神经网络结构示例 示例中的输入输出大小 实际举例说明2000个汉字文本数据集 初始化词嵌入矩阵 1. 输入层 2. 嵌入层 3. 卷积层 4. 全连接层 llama-3-8b.layers=32 llama-3-70b.laye…

如何快速看完一个网页上的视频

如何快速看完一个视频 懂的都懂。 Edge浏览器 添加下面两个书签&#xff1a; javascript:document.querySelector("video").dispatchEvent(new Event("ended"))javascript:var vdocument.querySelector("video");if(v){v.mutedtrue;v.playba…

Javaweb项目|ssm基于ssm的宠物医院管理系统的设计与实现vue

收藏点赞不迷路 关注作者有好处 文末获取源码 一、系统展示 二、万字文档展示 基于ssm基于ssm的宠物医院管理系统的设计与实现vue 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringSpringMVCMyBatisVue 工具&#xff1a;IDEA/Ecilpse、Navicat、Ma…

JMeter接口测试-5.JMeter高级使用

JMeter高级使用 案例&#xff1a; 用户登录后-选择商品-添加购物车-创建订单-验证结果 问题&#xff1a; JMeter测试中&#xff0c;验证结果使用断言&#xff0c;但断言都是固定的内容假如要判断的内容(预期内容)是在变化的, 有时候还是不确定的, 那该怎么办呢? 解决&…

stm32入门-----硬件I2C读写MPU6050

目录 前言 一、stm32中I2C库函数介绍&#xff08;stm32f10x_i2c.h&#xff09; 1.初始化 2.使能操作 3.生成起始位和结束位标志 4.发送I2C从机地址 5.发送数据和接收数据 6.发送应答位 7.状态检测 二、硬件I2C读取MPU6050 1.电路连线图 2.主要工程文件 3.MPU6050.…

虚拟机(CentOS7)安装jenkins

centos7安装jenkins 前提条件&#xff0c;安装jdk与maven 1、JDK17安装 # 进入系统管理员 sudo root # 进入对应文件夹下 cd /usr/local # 下载jdk17 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm # rpm命令安装下载的jdk17 rpm -ivh jdk-17_li…

GPU爆显存 | Windows下杀死GPU进程释放显存

文章目录 0 问题引入1 解决方案 0 问题引入 深度学习的时候&#xff0c;用CUDA加速训练了&#xff0c;但是进程没有完全结束&#xff0c;再跑的时候爆显存了。 1 解决方案 查看当前的GPU进程 nvidia-smi通过如下命令来杀死指定的进程。 taskkill /PID PID号 /F //例如&am…