C++笔记:类和对象(二)->继承

news2024/11/25 3:07:45

上篇内容:C++中的重载

继承

继承是什么

        在类和对象(一)->封装中说了,封装是将对应的属性和行为封装到一个类中。

那什么是继承呢?

        比如一个学校有老师和同学还有领导,那么我们最开始的想法就是每个职位都去封装一个类,同学类,老师类和领导类,为什么要不同的去封装他们,比如因为老师有老师独特的行为和属性,比如老师有工号属性和讲课行为,学生有学生独特的行为和属性,学生有学生ID和听课行为。然后他们应该都有名字、年龄、升高这些属性吧,那我就可以封装一个人类,来进行对这些属性的封装,然后如何将这些属性赋给同学类,老师类和领导类呢,那就是类和对象中的继承。

       学习C++重点:

        学习C++,不是主要学习C++的知识点,是通过学习C++程序设计的过程中去学习C++知识点。这个过程就是说设计这块C++代码为什么要通过这样的方式去书写代码,这样学习C++才不会觉得难,因为你会明白为什么C++代码逻辑要去这样设计,所以带着问题去学习。如果只学习C++中的知识点,你也无法进行代码设计,你会对实现对应功能时卡住,你会不知道如何进行去设计代码,这就是为什么很多人学习了C++但是他用C++写代码的能力很弱。

        打个比方,在看不懂我的代码时,先思考我的代码是逻辑具体需要干什么的,然后再去分析对应的语法知识点去搜索去查找为什么是这样写的。

        

通过代码来看如何进行继承

        子类(派生类),父类(基类),父类派生出了子类,子类基础于父类。

        Animal动物类,在动物类中有一个属性是__name名字,有个方法获取名字。

        Cat(猫类)通过来定义类后面:加上了public Animal字段就继承了动物类,通过了继承那么猫类就有了动物类中属性和行为,也就是__name名字和name()方法获取名字。

#include <iostream>
#include <string>
using namespace std;

class Animal {
public :
    void say_name() {
        cout << name << endl;
    }
    void set_name(string name) {
        this->name = name;
        return ;
    }
private :
string name;
};

class Cat : public Animal {
public :
    Cat() { set_name("Cat"); }
};

class Dog : public Animal {
public :
    Dog() { set_name("Dog"); }
};

class Snake : public Animal {
public :
    Snake() { set_name("Snake"); }
};



int main() {
    Cat c1;
    Dog d1;
    Snake s1;
    //继承了父类中的函数和属性
    //那么就可以调用父类中的函数
    c1.say_name();
    d1.say_name();
    s1.say_name();

    return 0;
}

继承权限

 下面是父类中的权限和继承权限结合后对外的访问权限。

注意:在继承权限为private和父类权限中为protected处是为private,这里的作用是,为了子类派生出的子类无法进行对该属性或方法进行访问。

如何去理解这个过程:

         外部访问权限就相当于继承权限和父类中对应的属性或方法的权限的结合,谁更低权限就是那个更低的权限。

        当子类派生出的子类,如果他需要访问当前子类的父类,就需要结合当前子类继承父类的权限和需要访问父类中属性或方法的权限,然后最终当前子类的子类得到最终的访问权限,通过权限去判定是否能访问当前需要访问的属性或方法。

        最后父类中private的属性和方法,他也继承给了子类,只是子类是无法进行访问的,但是他也继承给了子类。

 子类与父类的构造函数

子类与父类构造函数需要注意细节:

 构造顺序:第一原则先构造的后析构。因为先构造的对象可能会被后构造的对象依赖。比如a比b先构造,那么b的构造可能会依赖a对象,所以b的析构要先于a的析构。所以构造的对象后析构,这样符合栈的特性。

那么派生类和基类的构造顺序:

B继承于A,那么先构造A,在构造B。

代码演示:

#include<iostream>
using namespace std;

class A {
public :
    A() : x(99) {
        cout << "A default constructor" << endl;
    }
    A(int x) : x(x) {
        cout << "A parameter constructor" << endl;
    }
    int get_x() { return this->x; }
private :
    int x;
};


class B : public A{
public :
    //在创建子类对象时,如果明确不调用父类的默认构造函数
    //那就需要在初始化列表中明确调用需要调用的构造函数
    B() : A(98), y(100) {
        cout << "B default constructor" << endl;
    }
    //那么这里就会默认调用父类的默认构造
    B(int y) : y(y) {
        cout << "B parameter constructor" << endl;
    }
    //在调用子类的拷贝构造时,一定要显示的去调用父类的拷贝构造
    //这里调用父类的拷贝构造时,传入的是子类的对象
    //因为子类对象可以当作父类的对象引用
    B(const B &b) : A(b), y(b.y){
        cout << "B copy constructor" << endl;
    }
    B &operator=(const B &obj) {
        //对于子类的拷贝行为时,需要调用父类的拷贝,才能正确的进行拷贝
        //这里调用的是默认的赋值运算符
        this->A::operator=(obj);
        this->y = obj.y;
        return *this;
    }
    void output() {
        cout << get_x() << " " << y << endl;
    }
private :
    int y;
};



int main() {
    B b1;
    B b2(20);
    b1.output();
    b2.output();
    return 0;
}

菱形继承 

在这个过程中,A中如果有一个属性,BC都继承于A,那么他们都有A的这个属性,而D继承于BC,那么D继承BC中的A的属性时,他们都有A的属性,这时就会造成歧义,是继承B的还是C的,所以尽量不使用多继承。

然后如果非要使用,BC继承A时,加上virtual关键字虚继承。

class A {};
class B : virtual public A{};
class C : virtual public A{};
class D : public B, public C{};

这样D多继承B和C,就不会造成歧义,因为有了virtual关键字,在D类继承时他会进行对B类和C类中存储的A类中的属性合并成一份给D类,这样就不会造成歧义。

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

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

相关文章

免费通配符证书的申请指南——从申请到启动https

如果您的网站拥有众多二级子域名&#xff0c;那么通配符证书证书是最好的选择。 免费通配符申请流程如下&#xff1a; 1 创建证书服务商账号 首先选择一个提供免费通配符的服务商&#xff0c;打开国产服务商JoySSL官网&#xff0c;创建一个账号&#xff08;注册账号时填写注册…

共享办公室——一种成熟的工作空间解决方案

在固定的框架外寻求灵活性与创新&#xff0c;共享办公室租赁提供了一个动态且富有成本效益的工作环境&#xff0c;适应了快节奏和变化多端的商务需求。 随着创业文化的蓬勃发展和远程工作模式的流行&#xff0c;共享办公室以其独特的优势迅速成为市场上的新秀。它推动了工作…

深入理解 ANR WatchDog 库

ANR WatchDog 是一个用于检测 Android 应用程序中的 ANR (应用程序无响应) 的开源库。本文将深入探讨这个库的工作原理、如何集成到你的应用中&#xff0c;以及它如何帮助你避免用户体验不佳的情况。 ANR WatchDog 库的工作原理 ANR WatchDog 通过一个简单的机制来检测ANR&am…

如何学习网络安全?网络安全零基础入门,看这一篇就够了!

一、概述&#xff1a; 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。这涉及到保护企业数据、国家基础设施、知识产权以及维护网络…

伪装目标检测论文阅读 SAM大模型之参数微调:Conv LoRA

paper&#xff1a;link code&#xff1a;还没公开 摘要 任意分割模型(SAM)是图像分割的基本框架。虽然它在典型场景中表现出显著的零镜头泛化&#xff0c;但当应用于医学图像和遥感等专门领域时&#xff0c;其优势就会减弱。针对这一局限性&#xff0c;本文提出了一种简单有效…

Linux_Ubuntu18.04安装过程

目录 1. 虚拟机安装2. 虚拟机创建3. Ubuntu x64安装4. 开启重启问题 1. 虚拟机安装 版本&#xff1a;VMware-workstation-full-16.0.exe 下一步 接受 下一步 下一步&#xff0c;注意安装位置。 下一步 下一步 点击安装 等待安装完成。 2. 虚拟机创建 创建新的虚拟机 典型 稍后…

【Java那些事】关于前端收到后端返回的时间格式“2024-04-28T14:48:41“非想要的格式

问题&#xff1a; 后端操作后返回时间格式是"2024-04-28T14:48:41" 而我们想要的是&#xff1a;"2024-04-28 14:48:41", 两个解决方法&#xff1a; 方法一&#xff1a;使用 JsonFormat注解 Data AllArgsConstructor NoArgsConstructor public class Use…

前端高并发的出现场景及解决方法——技能提升——p-limit的使用

最近在写后台管理系统的时候&#xff0c;遇到一个场景&#xff0c;就是打印的页面需要根据传入的多个id&#xff0c;分别去请求详情接口。 比如id有10个&#xff0c;则需要调用10次详情接口获取到数据&#xff0c;最后对所有的数据进行整合后页面渲染。 相信大家或多或少都遇到…

MyBatis 插件介绍及应用

MyBatis 插件介绍及应用 MyBatis 是一个持久层框架&#xff0c;它允许开发者自定义 SQL 语句并将其映射到 Java 对象中。MyBatis 提供了一种灵活的数据库操作方式&#xff0c;但随着项目的复杂度增加&#xff0c;一些通用功能如分页、缓存、事务管理等可能需要重复编写。为了解…

仅1年!!影响因子10+飙升至30+,Springer旗下的潜力优刊,未来可期!

【SciencePub学术】今天小编给大家带来了一本医学类的高分优刊解读&#xff0c;隶属于Springer出版社&#xff0c;JCR1区&#xff0c;中科院1区TOP&#xff0c;创刊时间不长&#xff0c;但影响因子仅1年时间从10直接飙升至30&#xff0c;领域相符的学者可考虑&#xff01; Sign…

PaddlePaddle与OpenMMLab

产品全景_飞桨产品-飞桨PaddlePaddle OpenMMLab算法应用平台

基于LEAP模型的碳排放建模及行业、区域、国家等层面实践应用

线上方式&#xff1a;腾讯会议&#xff1b; 本期共计8次直播课&#xff0c;每节3小时。 5月24日-5月26日 每天&#xff08;8&#xff1a;30-11&#xff1a;30&#xff09;腾讯会议直播 5月31日-6月02日 每天&#xff08;8&#xff1a;30-11&#xff1a;30&#xff09;腾讯会…

Android 多媒体处理中ByteBuffer使用注意事项

Android多媒体处理中ByteBuffer使用注意事项 ByteBuffer 是 Java 中用来操作原始字节数据的类&#xff0c;它提供了一种灵活的方式来读取、写入和操作字节数据。以下是关于 ByteBuffer 的详细说明&#xff1a; 创建 ByteBuffer 你可以通过几种方式来创建 ByteBuffer&#xf…

新接口上线啦,近期我们增加了九个接口

天行数据近期新增了独立计次类接口&#xff1a;食物营养识别、数字识别、条形码识别和会员免费类接口&#xff1a;全国常用电话、健康小妙招、多音字查询、国际时区查询、英语格言等。 1、食物营养识别 通过输入图像资源&#xff0c;识别近两千种常见食物的详细营养成分及100…

转换图片为jpg格式?几个一键转换格式的方法

现在图片格式越来越多&#xff0c;我们经常需要对一些不符合要求的图片进行图片格式转换&#xff0c;否则就会出现打不开或者无法编辑处理的情况&#xff0c;那么对于一些不太懂电脑的小伙伴来说图片转格式会比较复杂&#xff0c;今天小编就来教大家几个简单的改变图片格式的方…

mars3d开发过程中点击面图层飞行定位,设置俯仰角度后,layer.flyTo({没有生效的排查思路

mars3d开发过程中点击面图层飞行定位&#xff0c;设置俯仰角度后&#xff0c;layer.flyTo({没有生效的排查思路记录&#xff0c;给大家提供一下以后排查定位问题的方向 问题场景相关代码&#xff1a; 1.项目本身代码&#xff1a; 2.精简了关键性代码后&#xff0c;就可以去ge…

【测试100问】面试:说说你印象最深的BUG,举个例子

一、场景 面试时被问&#xff0c;你印象中最深刻的 BUG是什么&#xff1f; 举个例子说明一下。 该如何回答比较好呢&#xff1f; 二、面试考察点 面试官问这道题&#xff0c;除了考察你发现问题的能力&#xff0c;还有你的表达能力、深度思考能力、归纳总结能力。 千万不要…

基于51单片机智能窗帘仿真设计( proteus仿真+程序+设计报告+讲解视频)

基于51单片机智能窗帘仿真设计( proteus仿真程序设计报告讲解视频&#xff09; 基于51单片机智能窗帘仿真设计 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真设计4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单资料下载链接&#xff1a; 仿真图proteus8.9及以上…

学习周报:文献阅读+Fluent案例+有限体积法理论学习

目录 摘要 Abstract 文献阅读&#xff1a;基于物理信息神经网络的稀疏数据油藏模拟 文献摘要 文章讨论|结论 各方程和原理简介 PINN简介 域分解 实验设置 单相油藏问题 油水两相问题 Fluent实例&#xff1a;Y型弯管中的流体混合分析 几何建模部分 网格划分 求解器设…

举个栗子!Tableau 技巧(272):学做曲线面积图(Sigmoid area charts)

曲线面积图&#xff08;Sigmoid area charts&#xff09;是区域图的一种创新变形&#xff0c;呈现数据随时间变化的情况&#xff0c;也可用于对数据总值趋势的洞察。 如何在 Tableau 中具体实现呢&#xff1f;今天的栗子&#xff0c;一睹为快吧&#xff01; 本期《举个栗子》…