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本来就是privates3.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;
}

运行结果:

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

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

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

相关文章

SpringBoot中全局异常捕获与参数校验的优雅实现

一&#xff0c;为什么要用全局异常处理&#xff1f; 在日常开发中&#xff0c;为了不抛出异常堆栈信息给前端页面&#xff0c;每次编写Controller层代码都要尽可能的catch住所有service层、dao层等异常&#xff0c;代码耦合性较高&#xff0c;且不美观&#xff0c;不利于后期维…

DLT 直接线性变换

DLT 直接线性变换 对于单应变换 x i ′ H x i x_i^{\prime}Hx_i xi′​Hxi​&#xff0c;易知两图中对应的特征点&#xff0c;如何找出所需要的 H H H​&#xff0c;为了解决这个问题&#xff0c;可以采用DLT算法 原理 其中采用Least Squares Error去拟合 其中目标是获得最佳…

【办公类-22-05】20240419 UIBOT填写“PATHS课程”的《SSBS校园行为问卷》

背景需求&#xff1a; 每年都有一个PATHS课程的“家长问卷调查”和“教师问卷调查”需要填写 作为教师&#xff0c;每次要对全班所有的孩子进行评价&#xff0c;每位孩子64题&#xff01; 反复点题目&#xff0c;感觉非常累&#xff0c;工作操作就是两位老师&#xff0c;每人做…

Golang | Leetcode Golang题解之第25题K个一组翻转链表

题目&#xff1a; 题解&#xff1a; func reverseKGroup(head *ListNode, k int) *ListNode {hair : &ListNode{Next: head}pre : hairfor head ! nil {tail : prefor i : 0; i < k; i {tail tail.Nextif tail nil {return hair.Next}}nex : tail.Nexthead, tail my…

U盘秒变0字节?别慌,数据恢复有妙招!

在日常的工作和生活中&#xff0c;U盘已成为我们不可或缺的数据存储工具。然而&#xff0c;有时候我们可能会遇到一个令人头疼的问题&#xff1a;原本存有重要文件的U盘&#xff0c;突然间容量显示为0字节。这意味着U盘中的数据全部丢失&#xff0c;无法读取。那么&#xff0c;…

hackthebox - Redeemer

2024.4.19 TASK 1 Which TCP port is open on the machine? 6379 TASK 2 Which service is running on the port that is open on the machine? redis TASK 3 What type of database is Redis? Choose from the following options: (i) In-memory Database, (ii) Traditiona…

UltraScale+的10G/25G Ethernet Subsystem IP核使用

文章目录 前言一、设计框图1.1、xxv_ethernet_01.2、xxv_ethernet_0_sharedlogic_wrapper1.3、xxv_ethernet_0_clocking_wrapper1.4、xxv_ethernet_0_common_wrapper 二、IP核配置三、仿真四、上板测速 前言 前面我们学习了很多基于XILINX 7系列的高速接口使用&#xff0c;本文…

组合预测 | Matlab实现ICEEMDAN-SMA-SVM基于改进完备集合经验模态分解-黏菌优化算法-支持向量机的时间序列预测

组合预测 | Matlab实现ICEEMDAN-SMA-SVM基于改进完备集合经验模态分解-黏菌优化算法-支持向量机的时间序列预测 目录 组合预测 | Matlab实现ICEEMDAN-SMA-SVM基于改进完备集合经验模态分解-黏菌优化算法-支持向量机的时间序列预测预测效果基本介绍程序设计参考资料预测效果 基本…

爬取微博评论数据

# -*- coding: utf-8 -*- import requests #用于发送请求并且拿到源代码 from bs4 import BeautifulSoup #用于解析数据 1.找到数据源地址并且分析链接 2.发送请求并且拿到数据 3.在拿到的数据中解析出需要的数据 4.存储数据 headers { "User-Agent": "…

Go微服务: go-micro集成链路追踪jaeger

关于链路追踪jeager的原理 参考: https://blog.csdn.net/Tyro_java/article/details/137754812 核心代码演示 1 ) 概述 这里接前文结构框架&#xff1a;https://blog.csdn.net/Tyro_java/article/details/137753232 2 &#xff09;核心代码&#xff1a;common/jaeger.go p…

C++中string的用法总结+底层剖析

前言&#xff1a;在C语言中&#xff0c;我们经常使用字符串进行一系列操作&#xff0c;经常使用的函数如下&#xff1a;增删改查 &#xff08;自己造轮子&#xff09;&#xff0c;C中设计出string容器&#xff0c;STL库中为我们提供了以上函数&#xff0c;所以我们使用string容…

华为OD-C卷-密码解密[100分]Python3+C语言-90%

题目描述 给定一段“密文”字符串 s,其中字符都是经过“密码本”映射的,现需要将“密文”解密并输出。 映射的规则(a ~ i)分别用(1 ~ 9)表示;(j ~ z)分别用("10*" ~ "26*")表示。 约束:映射始终唯一。 输入描述 “密文”字符串 输出描述 …

libftdi1学习笔记 7 - MPSSE I2C

目录 1. 初始化 2. 原理 3. i2cStart 4. i2cStop 5. i2cRecvByte 6. i2cSendByte 7. i2cRead 8. i2cWrite 9. 验证 9.1 初始化i2c 9.2 初始化gpio 9.3 写10个字节到EEPROM 9.4 读回10字节数据 9.5 运行结果 I2C&#xff08;主&#xff09;采用2个或3个GPIO模拟的…

QTableView获取可见的行数

场景 当我们需要实时刷新QTableView时&#xff0c;而此时tableView的数据量较大&#xff0c;如果全部刷新显然不合理&#xff0c;如果可以只对用户看的到的数据进行刷新那就最好了&#xff0c;经过一番摸索找到了几种方式&#xff0c;可供参考 代码 方法1 QVector<int>…

64B/66B编码 自定义PHY层设计

一、前言 之前的一篇文章讲解了64B/66B的基本原理&#xff0c;本篇在基于64B/66B GT Transceiver的基础之上设计自定义PHY。基本框图如下。 二、GT Mdule GT Module就按照4个GT CHannel共享一个GT COMMON进行设置&#xff0c;如下图。要将例子工程中的GT COMMON取出&#xff…

docker环境搭建

项目环境搭建 1、安装 Linux 虚拟机 &#xff08;1&#xff09;下载安装&#xff1a; VM VirtualBox 下载安装&#xff1a;Downloads – Oracle VM VirtualBox&#xff0c;要先开启CPU虚拟化 &#xff08;2&#xff09;通过vagrant&#xff0c;在VirtualBox中安装虚拟机 下…

STM32学习和实践笔记(15):STM32中断系统

中断概念 CPU执行程序时&#xff0c;由于发生了某种随机的事件(外部或内部)&#xff0c;引起CPU暂 时中断正在运行的程序&#xff0c;转去执行一段特殊的服务程序(中断服务子程序 或中断处理程序)&#xff0c;以处理该事件&#xff0c;该事件处理完后又返回被中断的程序 继…

修改Ubuntu的镜像源为清华镜像源

修改Ubuntu的镜像源为清华镜像源 1、首先使用以下命令备份现有的镜像源&#xff1a; cd /etc/apt sudo cp sources.list sources.list.bak 2、使用以下命令打开镜像源文件&#xff1a; sudo vim /etc/apt/sources.list 3、在vim插入模式下使用以下内容替换掉原镜像源…

MySQL基础-----约束详解

目录 一. 概述: 二.约束演示&#xff1a; 三.外键约束&#xff1a; 3.1介绍&#xff1a; 3.2外键约束语法&#xff1a; 3.3删除&#xff0c;更新行为&#xff1a; 一. 概述: &#x1f9d0;&#x1f9d0;概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制…

css面试题整理

css面试题 一、HTML语义化标签二、块级元素、内联元素、 行内块元素三、盒模型 一、HTML语义化标签 什么是HTML语义化标签&#xff1f;语义化标签的优势&#xff1f; HTML语义化标签顾名思义就是赋予标签含义&#xff0c;比如说<p>标签代表的是段落&#xff0c;还有<…