C++入门day3-面向对象编程(下)

news2024/11/19 20:26:41

前言:C++入门day3-面向对象编程(中)-CSDN博客


初识:继承特性

继承的基础语法

class A{
public:
    int a;
};
class B:public A
{
public:
    int b;
};

B类通过继承A类后,内部会继承一个int变量 a:从下图我们可以看到,B类型的对象mb在通过点运算符访问成员时,自动提示有a成员变量,而且看提示(A::a)我们知道还是A类中的成员变量a,通过继承的手段,让子类也能拥有该成员变量。一般我们将A类称为基类,也叫做父类;B类称为派生类,也叫做子类

继承的优劣

继承的好处

1.提高代码的可复用性:减少重复代码,避免代码冗余。

2.提高代码的可维护性:如果父类中的代码需要修改,不需要额外修改子类代码

3.为多态的实现奠定基础:通过继承可以实现不同子类对象对同一信号返回不同响应的功能

继承的弊端

1.破坏了子类的独立性:通过继承,子类与父类之间产生了紧密的耦合关系,当父类发生改变时,需要考虑子类功能是否受影响。

2.增加了程序的复杂性:如果程序中继承关系复杂的话,会削弱程序的可拓展性和可维护性

继承方式

C++中class的默认继承方式是private私有继承

下面给出父类代码,该模块后续子类都继承该父类

class father{
private:
    int f1;
protected:
    int f2;
public:
    int f3;
};
公共继承

继承时使用pubic关键字,使继承方式变为公共继承。在此继承方式下,子类可以访问父类中所有的公共成员。

class son1:public father{
/*
//隐藏代码
private:
    int f1;
protected:
    int f2;
public:
    int f3;
*/
public:
    int s1;
};
保护继承

继承时使用protected关键字,使继承方式变为保护继承。在此继承方式下,子类可以访问父类中的protected权限下的成员以及public权限下的成员,并将public权限缩小为protected权限

class son2:protected father{
/*
//隐藏代码
private:
    int f1;
protected:
    int f2;
    int f3;
*/
public:
    int s2;
};
私有继承

继承时使用private关键字,使继承方式变为私有继承。在此继承方式下,父类中的所有成员都将变更权限为private继承到子类中。此时子类无法访问父类任何成员。

class son3:private father{
/*
//隐藏代码
private:
    int f1;
private:
    int f2;
private:
    int f3;
*/
public:
    int s3;
};

总结:

1.变更权限是指继承过程的权限变更,父类本身成员的权限不变

2.继承只会缩小权限,不会增加权限

复习:

成员权限:

private:私有的,只能在该类内访问

protected:受保护的,该类及子类可访问

public:公共的,该类及子类可以访问,同时定义的对象也可以访问该权限下成员

继承中的对象模型:

继承后,私有成员只是隐藏了,一样会被继承到子类中。

 通过sizeof(son)我们也可以得知类的大小为16个字节,是父类的三个int整型变量加上子类的int变量s。一共4*4=16个字节。所以size=16。

构造与析构的顺序

子类继承父类后,子类创建对象时,也会调用父类的构造函数,那么现在的问题就是,二者的顺序是怎么样的呢。

让我们实验一下就可以了。

结果显而易见,先调用了父类的构造函数,再调用子类的构造函数。先析构子类,再析构父类。这个过程其实就类似于一个入栈与出栈的过程。构造顺序非常容易理解:没有父亲哪来的儿子,再记住析构顺序与构造时相反即可,你也不用纠结为啥不是先创建先死亡。事实上,这种现象叫做栈解旋

总结:构造时,先父后子;析构时,先子后父。

同名成员问题

在继承时,难免会存在成员名一样的问题。例如父类中有一个成员变量name,子类也有一个成员变量name,那么遇到成员同名的问题,我们该怎么办呢?不要慌,我们有规定。

访问子类成员:直接访问

访问父类成员:指明作用域

例如:

class father{
public:
     string name;
};
class son:public father{
public:
    string name;
};

int main(){
    son s;
    s.name;//访问子类name
    s.father::name;//明显访问的是父类name
    return 0;
}

 

尝试运行,通过。明显没有任何错误。

另外,我们说的不单是成员变量,包括成员函数,只要是成员访问方法都是一致的。

初始化参数列表的拓展使用

class A{
public:

    A(int num){
        cout<<"int构造"<<endl;
    }
};
class B:public A{
public:
    B(int num):A(num){
        //如果父类没有无参构造
        //可以在子类的构造函数中
        //利用初始化列表调用父类的构造函数
        //可以完成对子类隐藏的父类成员变量的初始化
    }

};

多继承语法

C++允许一个类继承多个类

语法:class 子类 : 继承权限修饰符 父类1 , 继承权限修饰符 父类2 ......

多继承可能会引发父类中有同名成员的出现,需要加以作用域区分

C++实际开发中不建议使用多继承

特殊的菱形继承我们需要了解一下。不过我们会放在多态学习时讲解。实际的开发中,能遇到的像输入输出流的类的继承关系中就有菱形继承。这时候我们先简单的知道一下就可以了


谢谢大家!!

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

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

相关文章

Nginx基础详解2(首页解析过程、进程模型、处理Web请求机制、nginx.conf语法结构)

续&#xff1a;Nginx基础详解1&#xff08;单体部署与集群部署、负载均衡、正反代理、nginx安装&#xff09;-CSDN博客 目录 4.Nginx默认首页的过程解析 5.Nginx进程模型的详解 5.1启动nginx后的关于nginx的进程查看 5.2master进程与process进程 5.3Nginx进程图解 5.4wo…

【已解决】【Hadoop】【./bin的使用】bash: ./bin/hdfs: 没有那个文件或目录

在 Hadoop 环境中&#xff0c;决定何时在命令前添加 ./bin 和如何处理路径 /home/hadoop 与 /usr/local/hadoop 的问题&#xff0c;主要取决于你的当前工作目录和环境变量的设置。以下是一些指导原则&#xff1a; 何时使用 ./bin&#xff1a; 当前目录是 Hadoop 安装目录&…

【分类|回归】深度学习中的分类和回归?离散数据or连续数值?

【分类|回归】深度学习中的分类和回归&#xff1f;离散数据or连续数值&#xff1f; 【分类|回归】深度学习中的分类和回归&#xff1f;离散数据or连续数值&#xff1f; 文章目录 【分类|回归】深度学习中的分类和回归&#xff1f;离散数据or连续数值&#xff1f;前言1.分类问题…

帆软通过JavaScript注入sql,实现数据动态查询

将sql语句设置为参数 新建数据库查询 设置数据库查询的sql语句 添加控件 JavaScript实现sql注入 添加事件 编写JavaScript代码 //获取评价人id var pjrid this.options.form.getWidgetByName("id").getValue();//显示评价人id alert("评价人&#xff1a;&…

单片机串口AT指令操作SIM800、900拨打电话

文章目录 一、前言1.1 功能简介1.2 拨打电话功能的应用场景1.3 SIM900A与SIM800C模块介绍1.4 原理图 三、模块调试3.1 工具软件下载3.2 准备好模块3.3 串口调试助手的设置3.4 初始化配置3.5 拨打电话的测试流程 四、代码实现4.1 底层的命令发送接口4.2 底层数据接收接口4.3 检测…

Cisco Packet Tracer的安装加汉化

这个工具学计算机网络的同学会用到 1.下载安装 网盘链接&#xff1a;https://pan.baidu.com/s/1CmnxAD9MkCtE7pc8Tjw0IA 提取码&#xff1a;frkb 点击第一个进行安装&#xff0c;按步骤来即可。 2.汉化 &#xff08;1&#xff09;复制chinese.ptl文件 &#xff08;2&…

四元组问题

目录 问题描述 输入格式 输出格式 样例输入 样例输出 说明 评测数据规模 运行限制 原题链接 代码思路 问题描述 从小学开始&#xff0c;小明就是一个非常喜欢数学的孩子。他喜欢用数学的方式解决各种问题。在他的高中时期&#xff0c;他遇到了一个非常有趣的问题&…

【Unity服务】如何使用Unity Version Control

Unity上的线上服务有很多&#xff0c;我们接触到的第一个一般就是Version Control&#xff0c;用于对项目资源的版本管理。 本文介绍如何为项目添加Version Control&#xff0c;并如何使用&#xff0c;以及如何将项目与Version Control断开链接。 其实如果仅仅是对项目资源进…

华盈伯乐 | Bio-Plex多重细胞因子检测技术培训及研讨会现场回顾

精彩华盈现场回顾 迎着朝霞&#xff0c;与会的伙伴们一早踏上了旅程&#xff0c;参与华盈生物与伯乐生命科学联合举办的Bio-Plex多重细胞因子检测技术培训及研讨会活动。随着活动的序幕缓缓拉开&#xff0c;我们迎来了一段充实而富有成效的学习之旅。 精彩开幕 华盈生物的副总…

SpringMVC4-SpringMVC获取请求参数

test_param.html&#xff1a; <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>测试请求参数</title> </head> <body> <h1>测…

解决Pymysql has no attribute ‘escape_string‘ 并且无法引入该模块

打印出的pymysql版本是1.4.6 需要import这个module&#xff0c;并且根据pymysql的版本import的方式还不同 import pymysqlif pymysql.__version__ >1.0.0:from pymysql.converters import escape_string else:escape_string lambda x: pymysql.escape_string(x)然而&am…

如何借助Java批量操作Excel文件?

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 前言 | 问题背景 在操作Excel的场景中&#xff0c;通常会有一些针对Excel的批量操作&#xff0c;批量的意思一般有两种&#xff1a; 对批量的Excel文件进行操作。如导入多个Excel文件…

鸿蒙OpenHarmony【小型系统基础内核(虚实映射)】子系统开发

虚实映射 基本概念 虚实映射是指系统通过内存管理单元&#xff08;MMU&#xff0c;Memory Management Unit&#xff09;将进程空间的虚拟地址与实际的物理地址做映射&#xff0c;并指定相应的访问权限、缓存属性等。程序执行时&#xff0c;CPU访问的是虚拟内存&#xff0c;通…

实现微信小程序中点击单词显示在input的交互功能指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

卷积神经网络-学习率

文章目录 一、学习率的定义二、学习率的作用三、学习率的调整方法1.有序调整(1).有序调整StepLR(等间隔调整学习率&#xff09;(2).有序调整MultiStepLR(多间隔调整学习率)(3).有序调整ExponentialLR (指数衰减调整学习率)(4).有序调整CosineAnnealing (余弦退火函数调整学习率…

TypeScript 设计模式之【单例模式】

文章目录 **单例模式**: 独一无二的特工我们为什么需要这样的特工?单例模式的秘密&#xff1a;如何培养这样的特工?特工的利与害代码实现单例模式的主要优点单例模式的主要缺点单例模式的适用场景总结 单例模式: 独一无二的特工 单例模式就像是一个秘密组织里的特殊特工。这…

Java介绍及JDK 21详细安装教程

文章目录 1. 文章简介2. Java和JDK的介绍与关系2.1 Java2.2 JDK 3. Java版本的发展历程4. Java 21安装步骤 1. 文章简介 本文介绍如何Java、JDK、Java的发展及如何快速安装JDK 21。内容详细充实&#xff0c;旨在帮助您快速了解并使用Java。 2. Java和JDK的介绍与关系 2.1 Jav…

828华为云征文|华为云Flexus云服务器X实例——部署EduSoho网校系统、二次开发对接华为云视频点播实现CDN加速播放

EduSoho 是一款功能强大的网校系统&#xff0c;能够帮助教育机构快速搭建在线学习平台。本文将详细介绍如何在华为云服务器上安装和部署 EduSoho 网校系统&#xff0c;以及二次开发对接华为云视频点播VOD来实现CDN加速播放。 edusoho本地存储的视频播放存在诸多弊端。一方面&a…

「C++系列」命名空间

【人工智能教程】&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站&#xff1a;【人工智能教程】 文章目录 一、命名空间1. 定义命名空间2. 使用命名空间中的成员3. 命名空间的…

SAP 利润分配-未分配利润的年初余额和年末余额不一致的问题

SAP OB53 本年利润科目的年初余额和年末余额不一致的问题 关于OB53科目的问题 OB53维护的本年利润科目 现象&#xff1a;为何去年年末的本年利润金额和今年年初的本年利润金额不一致。 解释原因&#xff1a; 本年利润科目的这种现象归根结底是“表结法”产生的&#xff0c;换…