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

news2024/10/1 12:24:46

前言: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/2166423.html

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

相关文章

Mesa三角形光栅化过程关键代码

1.先看下mesa三角形光栅化效果 2.这里是主要实现代码&#xff0c;Mesa的代码也是非常多&#xff0c;看了好多天。关键实现过程代码这个s_tritemp.h中 3.这里主要介绍渲染一个矩形的过程 a)在glut中两行代码: b) 中间过程代码忽略&#xff0c;进入static GLboolean run_render(…

生活英语口语柯桥学英语“再确认一下“ 说成 “double confirm“?这是错误的!

在追求英语表达的过程中&#xff0c;我们常常会遇到一些看似合理实则错误的表达习惯。今天&#xff0c;我们就来聊聊一个常见的误区——“再确认一下”被误译为“double confirm”。 “再次确认”不是double confirm 首先&#xff0c;我们需要明确&#xff0c;“double confi…

POI从3.14升级为5.2.0

最近word用的功能有点多&#xff0c;3.14功能太少&#xff0c;升级一下。 从5.0.X开始&#xff0c;poi-ooxml–schemas被重命名为poi-ooxml–full 最新版是5.3.0&#xff0c;但是word转pdf的工具最新到poi的5.2.0&#xff0c;所以用这个版本了 properties中变量 <poi.versio…

在docker中找不到文件

问题 这是我的Dockerfile&#xff1a; FROM mcr.microsoft.com/dotnet/sdk:8.0 as build WORKDIR /app EXPOSE 80COPY TotechsThunder.sln TotechsThunder.sln COPY mock/programminglanguages/programminglanguage.js mock/programminglanguages/programminglanguage.js COP…

大觅网之业务部署(Business deployment of Da Mi Network)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

ubuntu20.04.6 触摸屏一体机,外接视频流盒子开机输入登录密码触屏失灵问题解决方法

1. 首先直接运行xrandr命令&#xff0c;查看设备的相关信息&#xff1a; 运行之后会显示当前连接设备的屏幕信息&#xff0c;如下图&#xff0c;LVDS和VGA-0&#xff0c;而HDMI屏幕为disconnect&#xff0c;意为没有连接&#xff1a; 2. 设置开机主屏幕显示&#xff1a; xrand…

TypeScript 设计模式之【建造者模式】

文章目录 **建造者模式**&#xff1a;打造你的梦想之屋建造者的秘密建造者有什么利与害&#xff1f;如何使用建造者搭建各种房子代码实现案例建造者模式的主要优点建造者模式的主要缺点建造者模式的适用场景总结 建造者模式&#xff1a;打造你的梦想之屋 假设你想要一栋完美的…

LeetCode[简单] 876. 链表的中间结点

给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 思路 对任意正整数 n&#xff0c;中间结点的编号可以表示成 ⌊2n​⌋1。 解法一 /*** Definition for singly-linked list.* public class L…

数据分析:线性回归计算嵌套的组间差异

文章目录 介绍加载依赖包导入数据数据预处理数据概览线性回归画图森林图的特点:森林图的作用:总结系统信息介绍 在统计学中,嵌套的组间差异分析是一种评估不同组别间差异的方法,尤其适用于层级结构或分组数据。通过线性回归模型,我们可以计算出各个变量对于因变量的影响,…

priority_queue优先级队列(堆)详解。C++经验+1

什么是堆 首先我们先了解什么是堆&#xff1f;堆分为大根堆和小根堆。但其实大根堆会让人误以为是不是大的元素在下面呢&#xff1f;为了防止错误想法&#xff0c;大根堆也可以叫大顶堆。 大顶堆&#xff1a;顶上元素最大&#xff0c;上一层比下一层元素大。 小顶堆&#xff…

AI搜索软件哪个好,AI搜索引擎工具分享

随着AI技术的发展&#xff0c;AI搜索引擎工具正逐渐成为我们信息获取的重要方法。下面小编就来和大家分享一些好用的AI搜索引擎软件&#xff0c;感兴趣的同学可以逐个使用体验一下。因为每个AI搜索引擎工具不同&#xff0c;建议大家搜索的时候可以多个工具搜索&#xff0c;然后…

.netcore nacos注册成功,服务列表找不到任何服务

命令空间id不要自动生成 .netcore 配置文件里&#xff0c;Namespace 配置命名空间id 而不是命名空间名称。

OrangePi 烧录镜像步骤

理解&#xff1a;第一步&#xff1a;烧录镜像。第二步&#xff1a;建立编译环境&#xff08;一般是PC端的Linux虚拟机&#xff09;和板卡端的文件连接。因为要传文件&#xff0c;一般用挂载的方法。第三步&#xff1a;软件程序的编译与部署。 第一步&#xff1a;烧录镜像步骤 …

React学习笔记(四)——React 组件生命周期

目录 1. 生命周期-概览 2. 生命周期-挂载阶段 3. 生命周期-更新阶段 4. 生命周期-卸载阶段 5. setState扩展-发现问题 6. setState扩展-更多用法 7. setState扩展-异步 1. 生命周期-概览 了解react类组件生命周期整体情况 大致步骤&#xff1a; 什么是生命周期React类组…

AntFlow-Vue3 :一个仿钉钉流程审批,且满足99.8%以上审批流程需求的企业级工作流平台,开源且免费!

在现代企业管理中&#xff0c;流程审批的高效性直接影响到工作的流畅度与生产力。最近&#xff0c;我发现了一个非常有趣的项目—— AntFlow-Vue3 。这个项目不仅提供了一个灵活且可定制的工作流平台&#xff0c;还能让用户以可视化的方式创建和管理审批流程。 如果你是一名前…

10. 排序

一、排序的概念及引用 1. 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录…

Qt基础之四十七:管理员权限

在Windows系统中,以管理员身份运行的意思是,用系统管理最高权限运行程序。一般来说,只有当某些操作涉及系统保护区域时,才会需要用户授权管理员运行。如此一来,程序、命令在运行过程中,就有了足够权限,更改系统设置或注册表。 一.Qt程序加入管理员权限的几种方式 1.MS…

推荐一些免费下载恶意样本的网站

前一阵微步下载样本开始收费&#xff0c;算是又断了一个很好的白嫖途径。目前工作需求是不定期获取一批不同家族样本&#xff0c;看了看微步基础会员每天5次的下载限制&#xff0c;我默默把微步网页点了X&#xff0c;选择其他网站进行白嫖。 精确搜索 先列举出几个搜索比较简单…

【每天学个新注解】Day 6 Lombok注解简解(五)—@SneakyThrows

SneakyThrows 简化异常处理 并不建议日常开发中通过此注解解决异常捕获问题&#xff01;&#xff01;&#xff01; 允许方法抛出检查型异常而无需显式声明或捕获这些异常。这对于那些不希望在方法签名中声明异常或不愿意编写复杂的 try-catch 块的场景非常有用。 使用 SneakyT…

vue绘制评论页面

<template><div><div class"conmment_box"><div class"my-reply"><div class"reply-info"><el-inputfocus"focusInput"type"textarea"placeholder"请输入内容"v-model"tex…