C++ 继承(一)

一、继承的概念

继承是面向对象编程中的一个重要概念,它指的是一个类(子类)可以从另一个类(父类)继承属性和方法。子类继承父类的属性和方法后,可以直接使用这些属性和方法,同时也可以在子类中添加新的属性和方法,或者对父类的方法进行重写。继承的作用主要包括:

1、代码复用:通过继承,子类可以重用父类的代码,避免重复编写相同的代码,提高了代码的复用性和可维护性。

2、扩展功能:子类可以在继承父类的基础上,添加新的属性和方法,实现对父类功能的扩展。

3、多态性:继承是实现多态性的一种方式,通过父类引用指向子类对象,可以实现对不同子类对象的统一操作

二、继承公有操作

三种继承方式

公有继承(public inheritance)

私有继承(private inheritance)

保护继承(protected inheritance)

公有继承是应用更广泛的继承操作,它直接将父类的权限复制到子类中(不存在权限降级)。

注:在公有继承中,子类不可以访问父类的私有成员(private),只能通过父类提供的公有接口进行访问。

代码示例:父类为动物,子类分别是猫和狗,其中name(名字)和age(年龄)为复用项,color(颜色)为狗的扩展项,breed(品种)为猫的扩展项。

#include <iostream>
#include <string>

using namespace std;

class Animal{
    public:
        string name;
        int age;

        void eat()
        {
            cout<<"在吃饭"<<endl;
        }
        void sleep()
        {
            cout<<"在睡觉"<<endl;
        } 
};

class Dog:public Animal{
    public:
        string color;
        void lookhone()
        {
            cout<<name<<"在看家"<<endl;
        }
        //继承扩展
        void eat()
        {
            cout<<name<<"津津有味的啃着骨头"<<endl;
        }
        void sleep()
        {
            cout<<name<<"在狗窝里睡觉"<<endl;
        }
};

class Cat:public Animal{
    public:
        string breed;//品种
        void catchMouse()
        {
            cout<<name<<"在抓老鼠"<<endl;
        }
        void eat()
        {
            cout<<name<<"卯着劲的吃着猫粮"<<endl;
        }
        void sleep()
        {
            cout<<name<<"在猫窝里呼呼大睡"<<endl;
        }
};
int main()
{
    //创建Dog对象
    Dog dog;
    dog.name = "旺财";
    dog.age = 2;
    dog.color = "土黄色";
    dog.eat();
    dog.sleep();
    dog.lookhone();

    //创建Cat对象
    Cat cat;
    cat.name = "喵喵";
    cat.age = 1;
    cat.breed = "橘猫";
    cout<<"猫名:"<<cat.name<<endl;
    cout<<"猫龄:"<<cat.age<<endl;
    cout<<"品种:"<<cat.breed<<endl;
    cat.eat();
    cat.catchMouse();
    cat.sleep();

    return 0;
}

运行结果:

旺财津津有味的啃着骨头
旺财在狗窝里睡觉
旺财在看家
猫名:喵喵
猫龄:1
品种:橘猫
喵喵卯着劲的吃着猫粮
喵喵在抓老鼠
喵喵在猫窝里呼呼大睡

三、继承私有操作

派生类继承基类的成员,但这些成员在派生类中的访问权限是私有的,外部无法直接访问。

派生类可以访问基类的公有成员和保护成员,但外部代码无法访问这些成员。

私有继承会造成继承的子类的成员变量降级为private,导致子类和其他类都不能直接使用。

代码示例:

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

class Father{
    public:
        int a;
        void fun1()
        {
            cout<<"父类的公共方法"<<endl;
        }
    protected:
        int b;
        void fun2()
        {
            cout<<"父类的受保护方法"<<endl;
        }
    private:
        int c;
        void fun3()
        {
            cout<<"父类的私有方法"<<endl;
        }
};

class Son3:private Father{
    public:
        void fun()
        {
            a = 10;
            b = 20;
            // c = 30;报错,父类私有子类不能访问
            fun1();//private,权限降级
            fun2();
            // fun3();报错,父类私有子类不能访问
        }
};

int main()
{
    Son3 s3;
    //s3.a=10; a在子类中已经降级为private
    //s3.b=20; b在子类中已经降级为private
    //s3.c=30; c本来就是private
    s3.fun();
    return 0;
}

运行结果:

父类的公共方法
父类的受保护方法

四、保护继承

在C++中,使用protected访问修饰符可以实现保护继承,被protected修饰的成员可以被派生类继承,但不能被外部访问。

代码示例:

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

class Father{
    public:
        int a;
        void fun1()
        {
            cout<<"父类的公共方法"<<endl;
        }
    protected:
        int b;
        void fun2()
        {
            cout<<"父类的受保护方法"<<endl;
        }
    private:
        int c;
        void fun3()
        {
            cout<<"父类的私有方法"<<endl;
        }
};

class Son2:protected Father{
    public:
        void fun()
        {
            a = 10;
            b = 10;
            // c = 30;
            fun1();//protected,权限降级
            fun2();
            //fun3();
        }
};

int main()
{
    Son2 s2;
    // s2.a = 10
    // s2.b = 10;
    // s3.c = 30;

    s2.fun();
    return 0;
}

运行结果:

父类的公共方法
父类的受保护方法

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

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

相关文章

springboot+vue全栈开发【2.前端准备工作篇】

目录 前言准备工作Vue框架介绍MVVM模式 快速入门导入vue在vscode创建一个页面 前言 hi&#xff0c;这个系列是我自学开发的笔记&#xff0c;适合具有一定编程基础&#xff08;html、css那些基础知识要会&#xff01;&#xff09;的同学&#xff0c;有问题及时指正&#xff01;…

语雀如何显示 Markdown 语法

正常的文章链接 https://www.yuque.com/TesterRoad/t554s28/eds3pfeffefw12x94wu8rwer8o 访问后是文章&#xff0c;无法复制 markdown 的内容 在链接后增加参数 /markdown?plaintrue&linebreakfalse&anchorfalse 直接显示代码

ros2 RVIZ2 不显示urdf模型

ros2 RVIZ2 不显示urdf模型 我的情况是 &#xff1a; 没有如何报错但是不显示 Description Topic 手动写上 /robot_description

python使用tkinter和ttkbootstrap制作UI界面(二)

这次讲解UI界面常用的主键&#xff0c;延续上文的框架进行编写&#xff0c;原界面如下&#xff1a; Combobox组件应用&#xff08;下拉框&#xff09; """Combobox组件"""global comvalue_operatorcomvalue_operator tk.StringVar()value_ope…

就业班 第三阶段(nginx) 2401--4.19 day3 nginx3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundan…

黑马python-python基础语法

1.注释&#xff1a; 单行注释&#xff1a;#注释内容 多行注释&#xff1a; """ 第一行 第二行 第三行 """ 或 第一行 第二行 第三行 2.定义变量 变量名值 变量名满足标识符命名规则即可 3.标识符命名规则&#xff1a; 有数组、字母、下划线组成…

欢乐钓鱼大师加速、暴击内置脚本,直接安装

无需手机root,安装软件即可使用&#xff0c;仅限安卓。 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x

从零开始学习Linux(4)----yum和vim

1.Linux软件包管理器yum Linux中我们要进行工具/指令/程序&#xff0c;安装&#xff0c;检查卸载等&#xff0c;需要yum的软件 安装软件的方式&#xff1a; 源代码安装---交叉编译的工具rpm包直接安装yum/apt-get yum是我们Linux预装的一个指令&#xff0c;搜索&#xff0c;下…

claude3国内注册

claude3国内注册 Claude 3 作为大型语言模型的强大之处在于其先进的算法设计和大规模训练数据的应用&#xff0c;能够执行复杂和多样化的任务。以下是 Claude 3 主要的强项&#xff1a; 接近人类的理解能力&#xff1a;Claude 3 能够更加深入地理解文本的含义&#xff0c;包括…

外贸企业邮箱有什么用?如何选择适合的外贸企业邮箱?

外贸公司每天都需要与各个国家的客户打交道&#xff0c;通过邮箱聊天、谈合作。由于语言、文化差异&#xff0c;一个小错误可能会致使业务失败和数据泄漏风险。做为外贸企业的重要沟通工具&#xff0c;企业电子邮件的功效是显而易见的。那样&#xff0c;外贸企业邮箱有什么用&a…

【在本机上部署安装禅道详细操作步骤2024】

1、进入禅道官网&#xff0c;选择开源版进行下载&#xff1a;禅道下载 - 禅道开源项目管理软件 2、根据自身电脑环境选择合适的版本&#xff0c;此处是windows版本&#xff1a; 3、双击打开下载好的.exe安装包-选择安装目录-【Extract】-然后就等着安装完成就行了 4、安装完成…

JavaSE高阶篇-反射

第一部分、Junit单元测试 1&#xff09;介绍 1.概述:Junit是一个单元测试框架,在一定程度上可以代替main方法,可以单独去执行一个方法,测试该方法是否能跑通,但是Junit是第三方工具,所以使用之前需要导入jar包 2&#xff09;Junit的基本使用&#xff08;重点啊&#xff09; 1.…

【jinja2】模板渲染

HTML文件 return render_template(index.html)h1: 一级标题 变粗变大(狗头 <

VSCode断点调试(ROS)

0、安装ros插件 在扩展商店中安装ROS插件&#xff08;Microsoft&#xff09; 1、修改CMakeList.txt # set(CMAKE_BUILD_TYPE "Release") // 注释Release模式 set(CMAKE_BUILD_TYPE "Debug") // 设置为Debug模式 # set(CMAKE_CXX_FLAGS_RELEASE &…

PolarDB MySQL 版 Serverless评测|一文带你体验什么是极致弹性

PolarDB MySQL 版 Serverless评测|一文带你体验什么是极致弹性 什么是PolarDB MySQL 版PolarDB MySQL版体验弹性压测一弹性压测二弹性压测三弹性缩容 操作体验 在体验PolarDB MySQL 版之前&#xff0c;这里先为大家提供一下PolarDB MySQL 版 Serverless评测入口&#xff0c;以供…

五种主流数据库:集合运算

关系型数据库中的表与集合理论中的集合类似&#xff0c;表是由行&#xff08;记录&#xff09;组成的集合。因此&#xff0c;SQL 支持基于数据行的各种集合运算&#xff0c;包括并集运算&#xff08;Union&#xff09;、交集运算&#xff08;Intersect&#xff09;和差集运算&a…

neo4j使用详解(十八、java driver使用及性能优化<高级用法>——最全参考)

Neo4j系列导航&#xff1a; neo4j安装及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 neo4j索引及调优 neo4j java Driver等更多 1.依赖引入 <dependency><groupId>org.neo4j.driver</groupId><…

线程池 ThreadPoolExecutor 配置参数详解

《开发语言-Java》 线程池 ThreadPoolExecutor 参数详解 一、引言二、主要内容2.1 核心构造函数2.2 核心线程数2.3 最大线程数2.4 空闲线程存活时间2.5 keepAliveTime 的时间单位2.6 核心线程在空闲时的回收策略2.7 工作队列2.8 线程工厂2.9 拒绝策略 三、总结 一、引言 提到 …

密码学 | 承诺:基本概念

目录 正文 1 承诺的交互 2 承诺的属性 3 硬币抛掷问题 3.1 朴素版方案 3.2 承诺版方案 &#x1f951;源自&#xff1a;https://en.wikipedia.org/wiki/Commitment_scheme &#x1f951;写在前面&#xff1a;英文的承诺是 commitment scheme&#xff0c;否则很难进行…

项目实践---贪吃蛇游戏(游戏的概述)

这里要准备三个文件&#xff1a;1.头文件&#xff08;snake.h&#xff09; 2.测试文件&#xff08;test.c&#xff09; 3.主文件&#xff08;snake.c&#xff09; 贪吃蛇游戏是一个经典的C语言代码实现的项目&#xff0c;大约500行代码。对于大家来说&#xff0c;贪吃蛇都玩过…