c++之继承与缺省函数

news/2024/5/8 9:26:52/文章来源:https://blog.csdn.net/qq_55703811/article/details/130362388

文章目录

    • 一、缺省的构造函数
    • 二、缺省的拷贝构造函数
    • 三、缺省的赋值重载
    • 四、继承面试题

1.构造函数、拷贝构造、赋值重载、析构函数不能够被继承

一、缺省的构造函数

  • 如果基类和派生类中没有给出构造函数,则C++编译器自动给出一个缺省的构造函数,C++编译器在派生类的构造函数的初始化列表中加入基类的缺省构造函数的调用。

主要目的:将对象创建出来

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
class Person
{
private:int idPerson;
public:Person(){}  //无参void Dance()const{cout << "跳舞" << endl;}
};
class Student :public Person
{
private:int snum;
public:Student():Person(){}  //无参void Study()const{cout << "学习" << endl;}
};
  • 基类有缺省构造函数,有程序设计者定义
  • 程序设计者没有在派生类中定义构造函数
  • C++编译器会在派生类自动产生派生类的缺省构造函数
  • 在初始化表中加入基类的缺省构造函数的调用
class Person
{
private:int idPerson;
public:Person():idPerson(1){}Person(int id):idPerson(id){} //带参构造函数void Dance()const{cout << "跳舞" << endl;}
};
class Student :public Person
{
private:int snum;
public://Student():Person(){} //系统自己给出void Study()const{cout << "学习" << endl;}
};
  • 派生类构造函数程序设计者定义
  • 程序设计如果不在初始化列表中加入基类缺省的构造函数调用
  • C++编译器将在初始化表中加入基类缺省构造函数
class Person
{
private:int idPerson;
public:Person():idPerson(1){}Person(int id):idPerson(id){} //带参构造函数void Dance()const{cout << "跳舞" << endl;}
};
class Student :public Person
{
private:int snum;
public:Student(){} //没有在初始化列表中加入基类缺省的构造函数调用//Student():Person(){} //系统自己给出void Study()const{cout << "学习" << endl;}
};
  • 如果基类中没有给出无参的构造函数,只给出带参的构造函数,那么派生类无法合成相应的缺省函数进行调动
class Person
{
private:int idPerson;
public://Person():idPerson(1){} //没有给出Person(int id):idPerson(id){} //带参构造函数void Dance()const{cout << "跳舞" << endl;}
};
class Student :public Person
{
private:int snum;
public://Student():Person(){} //errorStudent():Person(1),snum(0){}Student(int id,int s):Person(id),snum(s){}void Study()const{cout << "学习" << endl;}
};

二、缺省的拷贝构造函数

  • 程序设计者在基类和派生类中都没有定义拷贝构造函数,C++编译器将自动产生按位拷贝的拷贝构造函数,在派生类的拷贝构造函数的初始化列表中,加入基类的拷贝构造函数的调用,是C++编译器合成的代码(基类、派生类都没有拷贝构造函数)
  • 程序设计者在基类中定义拷贝构造,但是派生类没有拷贝构造,C++编译器将在派生类自动产生按位拷贝的拷贝构造函数(基类中有、派生类中没有)
  • 程序设计者在基类派生类中都定义了拷贝构造函数,但是在派生类中没有调用基类的拷贝构造函数,C++编译器调用的是缺省构造函数,如果基类没有缺省构造,那合成代码失败。(基类,派生类都有拷贝构造函数)
  • 程序设计者在派生类中定义了拷贝构造,基类中没有定义,没有指定调用基类的拷贝构造函数时,C++编译器将调用基类的缺省构造函数(基类中没有、派生类中有)
class Person
{
private:int idPerson;
public://Person():idPerson(1){} //没有给出Person(int id):idPerson(id){} //带参构造函数Person(const Person& per):idPerson(per.idPerson)//拷贝构造{cout<<"Copy Person"<<endl;}void Dance()const{cout << "跳舞" << endl;}void PrintPerson(){cout<<"身份证号"<<idPerson<<endl;}
};
class Student :public Person
{
private:int snum;
public://Student():Person(){} //errorStudent():Person(1),snum(0){}Student(int id,int s):Person(id),snum(s){}Student(const Student& stud):Person(stud),_sum(stud._snum)//拷贝构造{cout<<"Copy Student"<<endl;}void Study()const{cout << "学习" << endl;}void PrintStudent(){PrintPerson();cout<<"学号"<<snum<<endl;}};

三、缺省的赋值重载

  • 程序设计者在基类和派生类中都没有重载operator=函数,C++编译器将在基类和派生类中自动产生按位赋值重载的函数(0,0)
  • 程序在基类中有赋值重载函数,在派生类没有赋值重载函数,C++编译会在派生类自动加入赋值重载语句(1,0)
  • 程序在基类中有赋值函数,在派生类有赋值重在函数,如果在派生类没有指明调用基类的赋值重载函数,那么编译器不会合成基类的赋值重载函数。也就是只会赋值派生类的成员属性。(1,1)
  • 程序在基类中没有赋值函数,在派生类有赋值重在函数,和上述情况相同(0,1)
class Person
{
private:int idPerson;
public://Person():idPerson(1){} //没有给出Person(int id) :idPerson(id) {} //带参构造函数Person(const Person& per) :idPerson(per.idPerson)//拷贝构造{cout << "Copy Person" << endl;}Person& operator=(const Person& per){if (this != &per){idPerson = per.idPerson;}return *this;}void Dance()const{cout << "跳舞" << endl;}void PrintPerson(){cout << "身份证号" << idPerson << endl;}
};
class Student :public Person
{
private:int snum;
public://Student():Person(){} //errorStudent() :Person(1), snum(0) {}Student(int id, int s) :Person(id), snum(s) {}Student(const Student& stud) :Person(stud), snum(stud.snum)//拷贝构造{cout << "Copy Student" << endl;}Student& operator=(const Student& stud){if (this != &stud){Person::operator=(stud);((Person*)this)->operator=(stud); //强转为Person}return *this;}void Study()const{cout << "学习" << endl;}void PrintStudent(){PrintPerson();cout << "学号" << snum << endl;}
};

补充:切片现象,派生类对象赋值给基类对象时,会产生切片现象

四、继承面试题

设计一个类型,在外部环境中不能创建该类的对象

class Singleton
{
private://protectedSingleton(int x = 0) :value(x) {} //将构造函数设置为私有或者保护int value;Singleton(const Singleton&)=delete; //c11Singleton& operator=(const Singleton&) = delete;//~Singleton(){}
public:~Singleton(){}
};

设计一个不能被继承的类

//将构造函数设计为私有的,但是不能为保护和公有
class non_herit
{
private:non_herit(){}
public:~non_herit(){}
};
class Base:public non_herit
{
public://Base():non_herit(){}
};

设计一个不能不继承的类,但是可以在外部环境创建该类的对象
方法一:单例模式

//单例模式
class Singleton
{
private://protectedSingleton(int x = 0) :value(x) {} //将构造函数设置为私有或者保护int value;Singleton(const Singleton&)=delete; //c11Singleton& operator=(const Singleton&) = delete;~Singleton(){}
public:~Singleton(){}static Singleton& getIntstance() //通过静态函数将对象创建出来{static Singleton s(10);return s;}
};int main()
{//Singleton s2 = Singleton::getIntstance();Singleton &s2 = Singleton::getIntstance();Singleton* sp = (Singleton*)malloc(sizeof(Singleton));//*sp = s2; //不允许这样赋值,所以把赋值重载删掉了
}

方法二:使用final关键字 C11新标准

class non_herit final //不能派生出子类型,但是可以继承其他类
{int value;
public:non_herit(int x=0):value(x){}non_herit(const non_herit&) = default;non_herit& operator=(const non_herit&) = default;~non_herit() = default;
};

设计一个能被继承的类,但是不能在外部环境创建该类的对象

class Object
{
protected:Object(){}Object(const Object &obj){}Object& operator=(const Object& obj){return *this;}
};
class Base :public Object
{
public:Base():Object(){}
};

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

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

相关文章

【Unity-ML】Unity机器学习(一)

安装环境&#xff1a;Windows10 Anaconda3(64-bit)&#xff0c;网上很多教程&#xff0c;例如这个anaconda下载及安装(保姆级教程) - 知乎anaconda包管理器和环境管理器&#xff0c;强烈建议食用 1.下载官网下载太慢可选用镜像下载 官网下载&#xff1a; Anaconda | Individua…

〖ChatGPT实践指南 - 零基础扫盲篇④〗- OpenAI API 相关介绍、提示-Prompt 与 完成-Completion

文章目录 ⭐ OpenAI API介绍⭐ 提示-Prompt 与 完成-Completion 介绍 这一章节将为各位小伙伴介绍一下 OpenAI 的 API 相关内容&#xff0c;以及在 ChatGPT 中两个经常被用来比较的名词&#xff1a;“提示-prompt” 与 “完成-completion”。 ⭐ OpenAI API介绍 OpenAI API 概…

JavaScript常用方法整理

文章目录 前言1.栈方法&#xff1a;push()、pop()2.队列方法&#xff1a;unshift()、shift()3.indexof()、lastIndexOf()、includes()4.操作方法&#xff1a;concat()、slice()、splice()5.Array.isArray()6.排序方法:sort()、reverse()7.转换方法&#xff1a;toString()、join…

【Winform学习笔记(二)】TextBox文本框实现按回车键触发Button事件

TextBox文本框实现按回车键触发Button事件 前言正文1、实现方法2、具体代码3、实现效果 前言 在本文中主要介绍 如何基于 Winform 框架实现 TextBox 文本框实现按回车键触发 Button 事件&#xff0c;该功能可实现在文本框中输入密码后不需要按登录或确定按钮&#xff0c;直接回…

vue页面内嵌iframe使用postMessage进行数据交互(postMessage跨域通信)

什么是postMessage postMessage是html5引入的API,它允许来自不同源的脚本采用异步方式进行有效的通信,可以实现跨文本文档,多窗口,跨域消息传递.多用于窗口间数据通信,这也使它成为跨域通信的一种有效的解决方案. vue父页面&#xff08;嵌入iframe的页面&#xff09; 在vue中…

webAPI学习笔记2(DOM事件高级)

1. 注册事件&#xff08;绑定事件&#xff09; 1.1 注册事件概述 给元素添加事件&#xff0c;称为注册事件或者绑定事件。 注册事件有两种方式&#xff1a;传统方式和方法监听注册方式 传统注册方式 利用 on 开头的事件 onclick <button οnclick“alert(hi~)”><…

如何构建可靠的台账数据——详解台账管理系统的使用方法

随着数字化的发展&#xff0c;越来越多的企业开始采用电子台账管理&#xff0c;实现了对各项业务数据的及时准确保存和管理。而在台账管理应用中&#xff0c;发票管理、工单管理和库房台账是三大重要方面。下面我将详细介绍一下台账管理系统。 一、发票管理 1.收票台账报表 …

【Python小技巧】使用Gradio构建基于ChatGPT的 Web 应用(附源码)

文章目录 前言一、Gradio是什么&#xff1f;二、使用Gradio构建基于ChatGPT的 Web 应用1. 安装gradio库2. 安装openai库&#xff08;ChatGPT的python库&#xff09;3. Web 应用示例&#xff08;源代码&#xff09; 总结 前言 随着人工智能的不断发展&#xff0c;各种智能算法越…

UE4架构初识(五)

UE4仿真引擎学习 一、架构基础 1. GameInstance UE提供的方案是一以贯之的&#xff0c;为我们提供了一个GameInstance类。为了受益于UObject的反射创建能力&#xff0c;直接继承于UObject&#xff0c;这样就可以依据一个Class直接动态创建出来具体的GameInstance子类。 UGam…

【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Go语言核心编程近期目标&#xff1a;写好专栏的每一篇文章 前几天瑶瑶子…

blender 制作城市建筑模型

我不是很会用blender 但是他可以直接制作一篇区域的建筑模型 BlenderGIS插件 城市建筑3D模型自动生成 教程_Zhichao_97的博客-CSDN博客 学习了两种 一种是通过geo.json自己加了一堆mesh 或者geometry 自己用three 做的模型 另一种是用blender 做一个整个的模型直接导入进去 …

降低风险和最大化成功:如何解决项目管理中的成本差异

作为项目经理&#xff0c;你知道让项目按计划进行并按预算进行对于项目管理的成功至关重要。你可以使用的关键工具之一是成本差异分析。但成本差异到底是什么&#xff0c;如何利用它来发挥优势呢&#xff1f; 定义成本差异 成本差异是项目实际成本与预算或计划成本之间的差异…

企业本地文档如何实现规范在线管理?

随着企业数字化生产方式的不断推进&#xff0c;网络办公和在线协作越来越普遍&#xff0c;企业内部可能出现大量的文件和文档&#xff0c;这些文档多存在于不同的设备和存储介质上&#xff0c;这给企业的信息管理带来了一定程度的困难。为了提高企业的知识管理效率&#xff0c;…

【大数据之Hadoop】二十、Yarn基础框架及工作机制

1、Yarn基础框架 Yarn是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。 YARN主要由ResourceManager、NodeManager、ApplicationMaster和…

修炼汇编语言第二章:内存地址空间(概述)

目录 前言 一、主板和接口卡 二、存储器各类芯片 三&#xff1a;内存地址空间 总结 前言 什么是内存地址空间呢&#xff1f;如果地址线为10&#xff0c;那么可以寻址1024个地址空间&#xff0c;这1024个地址空间就构成这个CPU的内存地址空间&#xff0c;下面本文将会介绍…

Python如何连接Mysql及基本操作

1.什么要做python连接mysql&#xff0c;一般是解决什么问题的 做自动化测试时候&#xff0c;注册了一个新用户&#xff0c;产生了多余的数据&#xff0c;下次同一个账号就无法注册了&#xff0c;这种情况怎么办呢&#xff1f;自动化测试都有数据准备和数据清理的操作&#xff…

代码在洛谷上跑得慢怎么办?

前言 你有没有试过以下几种情况&#xff1a; 代码在别的OJ上能过&#xff0c;在洛谷上就T了你的代码和同学的几乎相同&#xff0c;但他的AC了&#xff0c;你的却TLE了 遇到这些情况&#xff0c;你可能要花上一个多小时才能解决&#xff0c;甚至难以解决&#xff0c;将问题一…

C. Magic Ship(二分 + 前缀和)

Problem - C - Codeforces 你是一艘船的船长。最初你站在一个点(x1&#xff0c;y1)上&#xff08;很明显&#xff0c;海上的所有位置都可以用笛卡尔平面描述&#xff09;&#xff0c;你想要前往一个点(x2&#xff0c;y2)。 你知道天气预报——长度为n的字符串s&#xff0c;仅由…

对于程序员来说,搜索有多重要?

2023年4月24日&#xff0c;周一晚上。 今天我用Bing&#xff08;必应&#xff09;很快就搜索到了我需要的关于MFC的某个内容&#xff0c; 而我在百度和CSDN搜了好几天都没搜到&#xff0c; 当然&#xff0c;我认为这不仅仅是搜索引擎的问题&#xff0c;也可能是我搜索时输入…

SqlServer2022安装与配置_并用Navicat连接SqlServer---sqlserver工作笔记0001

首先去下载 SQL Server 下载 | Microsoft https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 首先去下载安装包,这里我们下最新的 下载这个免费版的 可以看到下面有个全功能免费版本下载他 然后点击安装 下载以后安装 选择自定义 然后安装