C++(6) 继承

news2024/12/24 1:25:46

文章目录

      • 继承
        • 1. 继承
          • 1.1 什么是继承
          • 1.2 C++ 继承方式
            • 1.2.1 基本案例
            • 1.2.2 继承权限组合
            • 1.2.3 继承中构造函数的说法
            • 1.2.4 继承中析构函数的执行顺序
            • 1.2.5 继承中变量名称冲突问题
            • 1.2.6 继承中函数【重写】

继承

1. 继承
1.1 什么是继承

面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得容易。达到重写代码功能和提高执行效率的效果。

当创建一个类时,不需要重新编写新的数据成员和成员函数, 只需要指定新键的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类

1.2 C++ 继承方式
1.2.1 基本案例

格式

class 子类 : 权限修饰符
{
}
#include <iostream>

using namespace std;

class Base
{
public:
    int mA = 1;
protected:
    int mB = 2;
private:
    int mC = 3;
};

/*
Base 类是 Son 的一个 public 修饰父类
Son 类是 Base 类的一个子类,或者可以认为 Son 类是 Base 类 派生类
*/
class Son : public Base
{
public:
    int nA = 1;
protected:
    int nB = 2;
private:
    int nC = 3;
};

int main(int argc, char const *argv[])
{
    Son * s = new Son;

    cout << "mA : " << s->mA << endl;
    // 当情况下,mB 是 Base 类中的 protected 修饰 成员变量,同时使用 public 方式继承
    // 子类对象无法在类外调用 mB
    // cout << "mB : " << s->mB << endl;
    // 当情况下,mB 是 Base 类中的 protected 修饰 成员变量,同时使用 public 方式继承
    // 子类对象无法s使用mC
    // cout << "mC : " << s->mC << endl;

    cout << "nA : " << s->nA << endl;

    // cout << "nB : " << s->nB << endl;

    // cout << "nC : " << s->nC << endl;

    return 0;
}
1.2.2 继承权限组合
继承对应的权限修饰\原修饰符publicprotectedprivate
publicpublicprotected无法继承
protectedprotectedprotected无法继承
privateprivateprivate无法继承
#include <iostream>

using namespace std;

/*
public:
    类内、子类类外都可以使用
protected:
    类内、子类可以使用,类外无法使用
private:
    类内可以使用,子类、类外无法使用
*/
class Base
{
public:
    int mA = 1;
    void test1() { cout << "test1 funtion" << endl; }
protected:
    int mB = 1;
    void test2() { cout << "test2 funtion" << endl; }
private:
    int mC = 1;
    void test3() { cout << "test3 funtion" << endl; }
};

/*
public 继承方式,父类的成员权限修饰符变化
    public --> public
    protected --> protected
    private 无法继承
*/
class Son1: public Base
{
public:
    void test()
    {
        cout << mA << endl;
        cout << mB << endl;
        // cout << mC << endl;

        test1();
        test2();
        // test3();
    }
};

/*
protected 继承方式,父类的成员权限修饰符变化
    public --> protected
    protected --> protected
    private 无法继承
*/
class Son2: protected Base
{
public:
    void test()
    {
        cout << mA << endl;
        cout << mB << endl;
        // cout << mC << endl;

        test1();
        test2();
        // test3();
    }
};

/*
private 继承方式,父类的成员权限修饰符变化
    public --> private
    protected --> private
    private 无法继承
*/
class Son3: private Base
{
    void test()
    {
        cout << mA << endl;
        cout << mB << endl;
        // cout << mC << endl;
    }
};


int main(int argc, char const *argv[])
{
    Son1 *s1 = new Son1;
    cout << s1->mA << endl;

    Son2 *s2 = new Son2;
    // cout << s2->mA << endl;

    Son3 *s3 = new Son3;
    // cout << s3->mA << endl;
    
    return 0;
}
1.2.3 继承中构造函数的说法
#include <iostream> 

using namespace std;

class Base
{
public:
    Base()
    {
        cout << "Base 类中的构造函数" << endl;
    }

    ~Base()
    {
        cout << "Base 类析构函数" << endl;
    }
};

class Son : public Base
{
public:
    Son()
    {
        cout << "Son 类构造函数" << endl;
    }
    ~Son()
    {
        cout << "Son 类析构函数" << endl;
    }
};

class GrandSon : public Son
{
public:
    GrandSon()
    {
        cout << "GrandSon 类析构函数" << endl;
    }
    ~GrandSon()
    {
        cout << "GrandSon 类析构函数" << endl;
    }
};

int main(int argc, char const *argv[])
{
    // 显式调用的时子类的五承诺书构造函数
    Son *s1 = new Son();
    /*
    Base 类构造函数
    Son 类构造函数
    */
    cout << "----------------------------------" << endl;
    delete s1;
    /*
    Son 类析构函数
    Base 类析构函数
    */
    cout << "----------------------------------" << endl;

    GrandSon *s2 = new GrandSon();
    /*
    Base 类构造函数
    Son 类构造函数
    GrandSon 类构造函数
    */
    cout << "----------------------------------" << endl;

    delete s2;
    /*
    GranSon 类析构函数
    Son 类析构函数
    Base 类析构函数
    */

    return 0;
}
1.2.4 继承中析构函数的执行顺序

在这里插入图片描述

1.2.5 继承中变量名称冲突问题
class Base
{
public:
    int num;
};

class Son : public Base
{
public:
    int num;
    
    void test()
    {
        // int Son::num;
        /*
        如果直接使用,编译器会考虑按照就近原则方式进行数据分配
        首选是 Son 类中的 num 数据
        */
        cout << num << endl;
        // int Base::num;
        /*
        如果需要使用 Base 中的 num,需要利用 :: 作用域运算符
        限制当前变量的作用范围
        */
        cout << Base::num << endl;
    }
};
1.2.6 继承中函数【重写】
#include <iostream>

using namespace std;

class Father
{
public:
    void name() { cout << "小鱼丸" << endl; }
    void hobby() { cout << "唱歌" << endl; }
};

/*
函数的重写 Ovreride
    1. 存在必要的继承关系
    2. 要求子类重写父类的函数,函数声明必须一致
    3. 可以按照子类要求完成哈桑农户内容实现

重写的存在可以降低开发中函数命名压力
*/
class Son : public Father
{
public:
    void name() { cout << "Glade" << endl; }
    void hobby() { cout << "吃" << endl; }
};

int main(int argc, char const *argv[])
{
    Son * s = new Son;  

    /*
    子类可以通过 public 继承得到父类中 public 修饰函数,
    类内调用但是父类的函数有可能无法满足子类的特征需求

    【重写父类函数】 Override
    */
    s->name();
    s->hobby();

    return 0;
}
{
public:
    void name() { cout << "Glade" << endl; }
    void hobby() { cout << "吃" << endl; }
};

int main(int argc, char const *argv[])
{
    Son * s = new Son;  

    /*
    子类可以通过 public 继承得到父类中 public 修饰函数,
    类内调用但是父类的函数有可能无法满足子类的特征需求

    【重写父类函数】 Override
    */
    s->name();
    s->hobby();

    return 0;
}

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

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

相关文章

STM32-电动车报警器

STM32-电动车报警器 1.振动传感器点亮LED灯 需求:当振动传感器接收到振动信号时&#xff0c;使用中断方式点亮LED1 //重写中断服务函数&#xff0c;如果检测到EXTI中断请求&#xff0c;则进入此函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {//一根中断线上接有多个…

基于springboot网上图书商城源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括网上图书商城的网络应用&#xff0c;在外国网上图书商城已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。网上图书商城具有网上图书信息管理功能的选择…

求两数之间的最大公约数和最小公倍数

1. 最大公约数和最小公倍数的概念 最大公约数&#xff1a;最大公因数&#xff0c;也称最大公约数、最大公因子&#xff0c;指两个或多个整数共有约数中最大的一个。a&#xff0c;b的最大公约数记为&#xff08;a&#xff0c;b&#xff09;&#xff0c;同样的&#xff0c;a&…

标准库中的string类(下)——“C++”

各位CSDN的uu们你们好呀&#xff0c;这段时间小雅兰的内容仍然是Cstring类的使用的内容&#xff0c;下面&#xff0c;让我们进入string类的世界吧&#xff01;&#xff01;&#xff01; string类的常用接口说明 string - C Reference string类的常用接口说明 string类对象的修…

C++ 数论相关题目 扩展欧几里得算法(裴蜀定理)

给定 n 对正整数 ai,bi &#xff0c;对于每对数&#xff0c;求出一组 xi,yi &#xff0c;使其满足 aixibiyigcd(ai,bi) 。 输入格式 第一行包含整数 n 。 接下来 n 行&#xff0c;每行包含两个整数 ai,bi 。 输出格式 输出共 n 行&#xff0c;对于每组 ai,bi &#xff0c;求…

SpringCloud--OpenFeign解析

一、OpenFeign简介 OpenFeign是一个声明式的Web服务客户端&#xff0c;它简化了与HTTP API的通信。它的底层原理主要基于Java的反射和动态代理&#xff0c;并且通过利用Spring AOP 框架、RestTemplate、Ribbon 和 Hystrix 等组件&#xff0c;将复杂的 HTTP 调用封装起来&#…

浏览器V8是怎么进行垃圾回收的

面试相关问题解答 1、浏览器V8是怎么进行垃圾回收的 浏览器的内存占用是有限制的&#xff1a; 64位系统&#xff1a;物理内存 > 16G > 最大堆内存限制为4G物理内存 < 16G > 最大堆内存限制为2G 32位系统&#xff1a;最大堆内存限制为1G为什么浏览器要对占用内…

云表企业级无代码案例-10天做出《运输车辆管理系统》

物流运输行业像物流公司、运输车队、出租客运公司等企业在车辆管理方面&#xff0c;因其行业特点而面临很多管理上难题&#xff1a; 一、管理的对象多&#xff1a;车辆多&#xff0c;如果有三方车辆挂靠&#xff0c;还要涉及到车主管理&#xff0c;关系错综复杂。 二、管理的信…

2024-01-24-redis4

秒杀活动 需求&#xff1a;库存中有10件商品 商品的信息自定义 同时有100个人去抢购&#xff08;这里100个人的抢购由jmeter来模拟&#xff09; jmeter的使用 在idea中将后台代码实现 package org.aaa.controller;import org.apache.commons.lang3.StringUtils; import org.sp…

LabVIEW机械臂轨迹跟踪控制

介绍了一个使用LabVIEW开发的机械臂轨迹跟踪控制系统。该系统的主要目标是实现对机械臂运动轨迹的精确控制&#xff0c;使其能够按照预定路径进行精确移动。此系统特别适用于需要高精度位置控制的场合&#xff0c;如自动化装配、精密操作等。 为了实现LabVIEW环境下的机械臂轨迹…

SpringSecurity(13)——OAuth2授权码模式

工作流程 基本使用 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>…

架构篇26:高可用存储架构-集群和分区

文章目录 数据集群数据分区小结上一篇我们讨论了高可用存储架构中常见的双机架构,分别为主备复制、主从复制、双机切换和主主复制,并分析了每类架构的优缺点以及适应场景。 今天我们一起来看看另外两种常见的高可用存储架构:数据集群和数据分区。 数据集群 主备、主从、主…

macOS与Linux相互投屏的方法

很多人面对跨系统投屏都望而却步。其实只要找对方法&#xff0c;两台不同系统的电脑也可以相互投屏。 今天就来看看Linux系统和macOS系统如何相互投屏&#xff01; 第一步&#xff0c;将Linux系统电脑和macOS系统电脑连接同一网络。假设是macOS系统投屏到Linux系统&#xff0c;…

第五季特别篇:一夜杯、游戏之宴 2017.04.26

第五季特别篇&#xff1a;一夜杯、游戏之宴 2017.04.26 OVA 第1话&#xff1a;一夜酒杯 / 一夜杯OVA 第2话&#xff1a;游戏之宴 / 遊戯の宴 OVA 第1话&#xff1a;一夜酒杯 / 一夜杯 遭到独角妖袭击的妖怪夫妇日土和初菜被夏目所救&#xff0c;这对妖怪夫妇制作的酒杯&#xf…

1_Matlab基本操作

文章目录 工作环境操作界面运行命令窗口使用历史窗口当前目录浏览器工作空间浏览器帮助系统 工作环境 操作界面 命令窗口&#xff1a;用户进行操作的主要窗口。可以输入各种MATLAB的命令。函数和表达式。同时操作的运算结构也会在该窗口出现。历史命令窗口&#xff1a;记录用户…

猫宁愿饿着也不吃猫粮?公认适口性排名前十的生骨肉冻干推荐

猫宁愿饿着也不吃猫粮&#xff1f;主人需要细心观察并分析情况。如果猫咪出现呕吐、腹泻、体温异常等其他异常症状&#xff0c;可能是生病了&#xff0c;应及时就医。如果排除疾病原因&#xff0c;可能是猫粮的口感已经让猫咪感到腻味&#xff0c;不愿意再吃。此时&#xff0c;…

ArcGIS Pro如何新建字段

无论是地图制作还是数据分析&#xff0c;字段的操作是必不可少的&#xff0c;在某些时候现有的字段不能满足需求还需要新建字段&#xff0c;这里为大家讲解一下在ArcGIS Pro中怎么新建字段&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的水…

优维全面可观测产品能力分解②:变更可观测

上周&#xff0c;我们推出了优维全面可观测能力介绍的系列性文章的第一篇&#xff1a;架构可观测。优维架构可观测是从系统架构的视角来呈现链路与服务的状态数据&#xff0c;点击可回看&#xff1a;架构可观测文章。本周&#xff0c;我们将推出本系列性文章的第二篇&#xff1…

基于springboot网上书城交易平台源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括网上书城管理系统的网络应用&#xff0c;在国外网上书城管理系统已经是很普遍的方式&#xff0c;不过国内的书城管理系统可能还处于起步阶段。网上书城管理系统具有网上书城信…

巴厘行记(五)——情人崖

欢迎览阅《巴厘行记》系列文章 巴厘行记巴厘行记&#xff08;一&#xff09;——海神庙 巴厘行记&#xff08;二&#xff09;——乌布之夜 巴厘行记&#xff08;三&#xff09;——Auntie和Mudi 巴厘行记&#xff08;四&#xff09;——乌布漫游 巴厘行记&#xff08;五&a…