当前位置: 首页 > news >正文

C++_继承

介绍

  • 继承的基本概念
    1.共性和个性 (PS:有相同的属性 但是 又有自己的特点)
  • 基类和子类
    1. 基类(父类) = 共性
    2. 子类(派生类) = 个性(特点)
  • 继承语法
    1.class 子类名:继承方式1 基类1,继承方式2 基类2{ 行为 };
  • 继承方式(PS:默认继承方式为:私有继承)
    1.公有继承: public
    2.保护继承: protected(PS:在子类中可以看到,子类可以访问)
    3.私有继承: private(PS:在子类中可以看到,但是无法访问)
  • 继承的使用场景
    1.创建的新类与现有的类相似,只是多出若干成员变量或成员函数时,可以使用继承。不但减少代码量,而且新类会拥有基类所有功能
    2.需要创建多个类,它们拥有很多相似的成员变量或成员函数时,可以使用继承。将这些类的共同成员提取出来,定义为基类,然后从基类继承,既可以代码复用,也方便后期维护
  • 继承注意事项
    1.在子类中定义基类同名的 公有成员和保护成员,子类中的成员会 隐藏 基类中的 同名成员,想访问被隐藏的成员,通过作用域限定符(::)+成员名 可以访问 被隐藏的基类成员
    2.在基类中构造函数设置为私有成员的化,子类无法进行继承
    3.子类初始化 基类成员变量 或者 函数需要显示构造

2.1基类成员初始化方法一:Student(string name, int age = 0, string gender = "男"):Person(name, age, gender){}//三参构造(PS:需要 基类有三参构造函数)
2.2基类成员初始化方法二:Student(string name, int age = 0, string gender = "男"){m_name = name;m_gender = gender;oage(age);}//无参构造(PS:需要 基类有默认无参构造函数)

公有继承特点

1.子类可以 直接访问 基类所有的 公有和保护成员,其效果如同它们是在子类中声明一样
2.对于基类的 私有成员,在子类中存在 但无法访问
3.子类对象 任何时候都可以被当成 基类对象

保护继承特点

1.使基类 公有成员 和 保护成员 进行保护化,只禁止外部通过该子类访问
2.子类指针 或 引用 不能隐式转换成基类类型 指针或引用

私有继承特点

1.将基类公有和保护成员私有化,禁止外部通过该子类访问,也禁止该子类的子类进行访问
2.子类指针 或 引用 不能隐式转换成基类类型 指针或引用

继承方式与访问控制

在这里插入图片描述

公有继承 保护继承 私有继承区别源码

#include<iostream>
#include<string>
using namespace std;
//基类A
class A
{public:int m_pub;//公有成员变量
protected:int m_pro;//保护成员变量
private:int m_pri;//私有成员变量
};
//子类B
class B:protected A//保护继承基类,在全局中是无法通过 子类去访问基类(包括子类的子类也无法访问)
{
public:void foo(){cout << m_pub << " " << m_pro << endl;}
};
//子类C
class C :private B//私有继承,无法访问任何成员
{
public://B::foo();//无法访问B类中成员函数
};
void main()
{A a;a.m_pub = 10;B b;//b.m_pub;//可以看见,但是无法访问system("pause");
}

子类内存布局

子类对象内存布局图:
在这里插入图片描述

源码

#include<iostream>
#include<string>
using namespace std;class A
{
public:A(){ cout << "A构造" << endl; }~A(){ cout << "A析构" << endl; }
};
class Person:public A//人
{
public://默认构造函数Person(){ cout << "Person构造" << endl; }//构造函数Person(string name, int age, string gender) :m_name(name), m_age(age), m_gender(gender){}//析构函数~Person(){ cout << "Person析构" << endl; }
public:void eat(){ cout << "吃饭" << endl; }void sleep(){ cout << "睡觉" << endl; }//打印函数void print(){cout << m_name << " " << m_age << " " << m_gender << endl;}//获取年龄int oage(int age){return m_age = age;}
protected:string m_name;//名字string m_gender;//性别
private:int m_age;//年龄
};
//子类 学生
class Student:public Person//人
{
public://构造函数Student(string name, int age = 0, string gender = "男")/*:Person(name, age, gender)//三参构造*/{cout << "Student构造" << endl;//基类成员初始化方法二m_name = name;m_gender = gender;oage(age);}//打印void study(){eat();cout << "学习" << endl;m_name = "一航";}~Student(){cout << "Student析构" << endl;}
};
void main()
{
//构造 and 析构流程测试{//构造子类对象Student stu("一航");cout << "--------------分隔符--------------" << endl;//函数调用stu.study();cout <<"--------------分隔符--------------"<< endl;//拷贝子类对象操作Person*Ph1 = &stu;Person&Ph2 = stu;//打印结果Ph1->print();Ph2.print();cout << "--------------分隔符--------------" << endl;}system("pause");
}

运行结果

A构造
Person构造
Student构造
--------------分隔符--------------
吃饭
学习
--------------分隔符--------------
一航 0 男
一航 0--------------分隔符--------------
Student析构
Person析构
A析构
请按任意键继续. . .

相关文章:

C++_继承

介绍 继承的基本概念 1.共性和个性 (PS:有相同的属性 但是 又有自己的特点) 基类和子类 1. 基类(父类) 共性 2. 子类(派生类) 个性(特点) 继承语法 1.class 子类名:继承方式1 基类1,继承方式2 基类2{ 行为 };继承方式(PS:默认继承方式为:私有继承) 1.公有继承: public 2.保护…...

Java-IO流-15

文件操作 文件创建 package com.edu.file;import org.junit.jupiter.api.Test;import java.io.File; import java.io.IOException;public class Demo01 {public static void main(String[] args) {}Test//方式1public void create01(){String filePath "D:\\new1.txt&q…...

java中使用redis

1、redis数据类型 1.1、5种数据类型 redis存储的是key-value结构的数据&#xff0c;其中key是字符串类型&#xff0c;value有5种常用的数据类型&#xff1a;字符串 string、哈希 hash、列表 list、集合 set、有序集合 sorted set / zset。 字符串(string)&#xff1a;普通字符…...

Mongodb的可重试读操作

目录 重试读操作 需要条件 启用重读 支持可重试读的操作 不支持可重试读的操作 行为 重试读操作 连接mongodb进行读操作时&#xff0c;遇到网络或数据库集群的主节点切换导致的数据读问题。mongodb驱动自动尝试重新执行读操作。 需要条件 数据库连接驱动支持mongodb4.2…...

2024年1月2日-1月7日(ue5底层渲染+ue arpg+项目需求)

按照月计划&#xff0c;按照每小时分四段进行&#xff0c;arpg一例ue5底层渲染0.1小时arpg一例项目需求的相关视频教程一段 周二&#xff1a; 18&#xff1a;30- 19:30&#xff08;1小时&#xff09;ue arpg (88-89) ue5底层渲染03A14&#xff08;6&#xff1a;08&#xff09;…...

MySQL中的视图和触发器

SQL 视图 1 ) 概述 在mysql中&#xff0c;视图是一个非真实存在的虚拟表其本质是&#xff0c;根据sql语句获取动态的数据集&#xff0c;并为其命名用户使用时只需使用名称&#xff0c;即可获取结果集&#xff0c;并可以将其当做表来使用 2 &#xff09;用法示例 2.1 比较麻烦…...

uView-UI v2.x常见问题整理

为了更好的给大家提供 uView UI 的技术支持&#xff0c;uView UI 团队整理常见问题文档&#xff0c;大家可以阅读查找常见的问题解决办法。 uView 2.x 文档 https://www.uviewui.com uView 1.x 文档 https://v1.uviewui.com uView UI uni-app 主页 DCloud 插件市场 uVie…...

MBTI职业性格测试 28题(免费版)

MBTI职业性格测试概述 MBTI是现在国际上最为流行的测试工具&#xff0c;利用MBTI职业性格测试&#xff0c;可以清楚地找到自己的性格特点以及兴趣爱好&#xff0c;方便于对职业进行规划、以及改善人际关系。其主要应用心理学常识对个性做出判断&#xff0c;提炼出动力、信息收…...

Springcloud 微服务实战笔记 Ribbon

使用 Configurationpublic class CustomConfiguration {BeanLoadBalanced // 开启负载均衡能力public RestTemplate restTemplate() {return new RestTemplate();}}可看到使用Ribbon&#xff0c;非常简单&#xff0c;只需将LoadBalanced注解加在RestTemplate的Bean上&#xff0…...

CSS基础笔记-04cascade-specificity-inheritance

CSS基础笔记系列 《CSS基础笔记-01CSS概述》《CSS基础笔记-02动画》CSS基础笔记-03选择器 前言 Cascading Style Sheets&#xff0c;关键就在于这个cascading&#xff0c;对于这个术语理解&#xff0c;感觉对于我这种CSS新手有点儿不太friendly。本文记录下我对这个术语的理…...

Spring应用的部署与管理

一、前言 部署是将开发好的应用发布到服务器上&#xff0c;使其能够被用户访问的关键步骤。Spring框架提供了灵活的部署选项&#xff0c;本文将介绍Spring应用的常见部署方式和一些建议&#xff0c;帮助开发者顺利将应用投放到生产环境。 二、传统部署方式&#xff1a;WAR包 传…...

B端产品经理学习-需求挖掘

B端产品需求挖掘 目录 识别和管理干系人 决策人和负责人需求挖掘 针对用户进行需求挖掘 用户访谈结果整理 B端产品的需求来源是非常复杂的&#xff0c;要考虑多个方面&#xff1b;如果你是一个通用性的产品&#xff0c;要考虑市场、自身优劣势、干系人。而定制型B端产品会…...

整数规划基本原理

1.1 定义 规划中的变量&#xff08;部分或全部&#xff09;限制为整数时&#xff0c;称为整数规划。若在线性规划模型中&#xff0c;变量限制为整数&#xff0c;则称为整数线性规划。目前所流行的求解整数规划的方法&#xff0c;往往只适用于整数线性规划。目前还没有一种方法…...

秋招复习之堆

目录 前言 堆 堆的常用操作 堆的实现&#xff08;大根堆&#xff09; 1. 堆的存储与表示 2. 访问堆顶元素 3. 元素入堆 4. 堆顶元素出堆 Top-k 问题 方法一&#xff1a;遍历选择 方法二&#xff1a;排序 方法三&#xff1a;堆 总结 前言 秋招复习之堆。 堆 「堆 heap…...

算法训练营Day36(贪心-重叠区间)

都算是 重叠区间 问题&#xff0c;大家可以好好感受一下。 都属于那种看起来好复杂&#xff0c;但一看贪心解法&#xff0c;惊呼&#xff1a;这么巧妙&#xff01; 还是属于那种&#xff0c;做过了也就会了&#xff0c;没做过就很难想出来。 不过大家把如下三题做了之后&#…...

如何利用Oracle官方网站不登录账号下载和安装非最新版本的JDK(版本自由选择)

一、JDK概述 JDK&#xff08;Java Development Kit&#xff09;是Java开发工具集&#xff0c;是针对Java编程语言的软件开发环境。它包含了Java编译器、JRE&#xff08;Java运行时环境&#xff09;以及其他一些用于开发、调试和测试Java应用程序的工具&#xff0c;是Java开发人…...

税法相关的基础知识

文章目录 税法原则1.税法基本原则2.税法适用原则 来和大家聊聊税法相关的基础知识 税法原则 1.税法基本原则 2.税法适用原则...

ListNode 2487. 从链表中移除节点,单调栈的应用

一、题目 1、题目描述 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 2、接口描述 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nu…...

vue3中pdf打印问题处理

1 get请求参数问题 之前的请求是post得不到参数&#xff0c;今天发现的问题很奇怪&#xff0c;从前端进入网关&#xff0c;网关居然得不到参数。 前端代码 const print () > {let linkUrlStr proxy.$tool.getUrlStr(proxy.$api.invOrder.psiInvOrder.printSalOutstock,{a…...

如何向嵌入式设备中添加tcpdump工具

说明&#xff1a;tcpdump是一个在网络设备调试中一个非常重要的工具&#xff0c;它并不像hexdump等工具集成在busybox里面&#xff0c;也不像其他的软件一样只需要依赖linux标准的库就可以实现&#xff0c;它需要pcap相关的库和加密的相关库。 本文主要是基于realtek 83系列的…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...