C++三大特性之一:继承

文章目录

  • 前言
  • 一、继承方式
  • 二、继承类型
    • 继承中构造和析构的顺序
    • 继承中的内存分配
    • 多继承语法(非重点)
    • 继承中同名静态成员的处理
    • 继承一般在哪里用到
    • 进阶:菱形继承和虚拟继承
  • 总结


前言

C++三大特性:继承、多态和封装。继承是面向对象编程的一个核心概念,它允许我们根据一个已存在的类(基类或者叫父类),创建一个新的类(派生类或者叫子类),这个新的类继承了类的属性和行为。

一、继承方式

1.继承格式。class 子类名 :继承属性(public\protected\private)父类名{ ...}
2.注意父类名后面没有()
3.继承的子类调用继承过来的成员时候,直接写的是子类的名字调用

class www {
public:void head() {cout << "头" << endl;}void wei() {cout << "尾" << endl;}void ce() {cout << "侧" << endl;}
};class c :public www {
public:void cqq() {cout << "c++" << endl;}
};

二、继承类型

1.c++有三种继承类型:公有继承(public)、保护继承(protected)和私有继承(private)。
2.简记:私有继承子类是不能继承的,公有和保护继承要看优先级
在这里插入图片描述

继承中构造和析构的顺序

1.构造顺序:首先是父类的构造、然后是子类的构造。
2.析构顺序:首先是子类的析构。然后是父类的析构。

#include<iostream>
using namespace std;class dad {
public:dad() {cout << "dad的构造函数已调用:  " << endl;}~dad() {cout << "dad的析构函数已调用" << endl;}
};class son :public dad {
public:son() {cout << "son的构造函数已调用: " << endl;}~son() {cout << "son的析构函数已调用" << endl;}
};void test() {son s1;
}int main() {test();system("pause");return 0;}

输出:
构造和析构顺序

继承中的内存分配

1.父类的非静态成员都会被继承(也就是除了static的)
2.私有属性也会被继承,只是被隐藏 了
3.3.应用菜单:开发人员命令提示工具查看对象 Developer Command Prompt for VS 2017

  • cd 具体路径下 进入文件中
  • dir查看文件
  • cl /d1 reportSingleClassLayoutson xxxx.cpp就出来了。记忆:报告单个类布局类名 文件名
#include<iostream>
using namespace std;
#include<string>class dad {
public:int a;
private:int b;
protected:int c;
};class son :public dad {
public:int d;
};void test() {son s1;cout << "son的长度为:  " << sizeof(s1) << endl;
}int main() {test();system("pause");return 0;}

输出
在这里插入图片描述

多继承语法(非重点)

1.公式:class 子类:public 父类1,public 父类2{...}

2.如果继承的两个父类都有同名成员,调用的时候一定要加作用域

3.实际开发不要用那么多多继承,可能存在两个人写两个父类,成员名相同

继承中同名静态成员的处理

1.静态成员变量是类级别的,而不是对象级别的。在子类和父类中,如果有同名的静态成员变量,它们被视为两个独立的变量。

继承一般在哪里用到

1.在游戏开发中,继承经常用于创建角色、物品、敌人等游戏对象的层次结构。例如,一个 Enemy 类可能继承自一个更通用的 GameObject 类,而不同类型的敌人(如 BossEnemy 或 MinionEnemy)则可以进一步继承自 Enemy 类。

进阶:菱形继承和虚拟继承

1.菱形继承指的是,父类A有两个子类B1和B2,但是C使用多继承了B1和B2。当C调用A的成员函数时,有两条路径达到A那里。会造成混乱
2.解决菱形继承的方法就是虚拟继承,B1和B2在继承A时候使用虚拟继承。`class 子类名:virtual public 父类{};
3.

class Animal
{
public:int m_Age;
};//继承前加virtual关键字后,变为虚继承
//此时公共的父类Animal称为虚基类
class Sheep : virtual public Animal {};
class Tuo   : virtual public Animal {};
class SheepTuo : public Sheep, public Tuo {};void test01()
{SheepTuo st;st.Sheep::m_Age = 100;st.Tuo::m_Age = 200;cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl;cout << "st.Tuo::m_Age = " <<  st.Tuo::m_Age << endl;cout << "st.m_Age = " << st.m_Age << endl;}
int main() {test01();system("pause");return 0;}

4.虚拟继承可能会引入一些额外的开销,因为它需要维护一个指向共享基类的指针或偏移量,以确保正确地访问基类成员。因此,在设计类结构时应该仔细考虑是否真正需要虚拟继承。

总结

主要理解继承的方式,继承的类型有三种,私有属性无论哪种继承都不可以调用的,但是内存是占用的。继承是把非静态成员都继承了,同名静态成员的调用需要指明作用域。使用虚拟继承可以解决菱形继承的问题,但是会导致内存开销变大。

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

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

相关文章

IMUGNSS 误差状态卡尔曼滤波器(ESKF)的离散时间的ESKF 运动方程与运动过程

IMU&GNSS 误差状态卡尔曼滤波器&#xff08;ESKF&#xff09;的离散时间的ESKF 运动方程与运动过程 离散时间的ESKF 运动方程ESKF的运动过程 离散时间的ESKF 运动方程 名义状态变量的离散时间运动方程可以写为&#xff1a;&#xff08;不用考虑噪声&#xff0c;噪声在误差…

华为 2024 届实习招聘——硬件-电源机试题(四套)

华为 2024 届实习招聘——硬件-电源机试题&#xff08;四套&#xff09; 部分题目分享&#xff0c;完整版带答案(有答案&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共四套&#xff09; 获取&#xff08;WX:didadidadidida313&…

LeetCode - 283.移动零

题目链接&#xff1a; LeetCode - 283.移动零 题目分析&#xff1a; ​​​​​ 题解代码&#xff1a; #include<iostream> #include<vector> using namespace std;class Solution { public:void moveZeroes(vector<int>& nums) {for (int cur 0, des…

【001_音频开发-基础篇-专业术语】

001_音频开发-基础篇-专业术语 文章目录 001_音频开发-基础篇-专业术语创作背景术语表常见音源HDMI相关声音系统立体声2.1 声音系统5.1 环绕声系统5.1.2 环绕声系统7.1 环绕声系统7.1.4 环绕声系统9.1.4 环绕声系统 音质等级定义QQ音乐网易云音乐 创作背景 学历代表过去、能力…

ChatGPT研究论文提示词集合1-【主题选择与问题研究、文献综述】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 目录 1.主题选择与问题定义 2.文献综述 3.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程&#xff0c;精心准备一套学术研究各个流程的提示词集合。总共14个步骤…

C++相关概念和易错语法(7)(初始化列表、隐式类型转换、友元)

1.初始化列表 初始化列表是集成在构造函数里面的&#xff0c;对象在创建的时候一定会调用构造函数&#xff08;就算不显式定义&#xff0c;也会自动生成并调用&#xff09;。初始化列表就是这些对象的成员变量在创建的时候初始化的地方。 下面是使用的例子&#xff0c;可以先…

【CVPR2023】《A2J-Transformer:用于从单个RGB图像估计3D交互手部姿态的锚点到关节变换网络

这篇论文的标题是《A2J-Transformer: Anchor-to-Joint Transformer Network for 3D Interacting Hand Pose Estimation from a Single RGB Image》&#xff0c;作者是Changlong Jiang, Yang Xiao, Cunlin Wu, Mingyang Zhang, Jinghong Zheng, Zhiguo Cao, 和 Joey Tianyi Zhou…

7. DAX 时间函数-- DATE 日期--TOTALMTD、TOTALQTD、TOTALYTD

函数名目的语法返回值TOTALMTD计算当前上下文中该月份至今的表达式的值 。TOTALMTD ( <表达式>, <日期列>, [<筛选器>] )标量 表示表达式的标量值&#xff0c;在“日期”中给定日期&#xff0c;计算当前月份至今的日期 。TOTALQTD计算当前上下文中该季度至今…

k8s 部署 kube-prometheus监控

一、Prometheus监控部署 1、下载部署文件 # 使用此链接下载后解压即可 wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/heads/release-0.13.zip2、根据k8s集群版本获取不同的kube-prometheus版本部署 https://github.com/prometheus-operator/k…

Unity实现动态数字变化

最近的项目需要动态显示数字&#xff0c;所以使用Text组件&#xff0c;将数字进行变化操作过程记录下来。 一、UI准备 1、新建一个Text组件 2、新建C#脚本 3、将Text挂载到脚本上 二、函数说明 1、NumberChange 方法 NumberChange 方法接收四个参数&#xff1a;初始数字 in…

页面动态滑动事件如何实现?锚点如何实现?

在提交材料、页面互动时候&#xff0c;锚点是一个常用的东西&#xff0c;实现: 应用场景测试场景测试源码 应用场景 测试场景 当点击submit时候&#xff0c;即可滑动到对应的id标签 测试源码 <!DOCTYPE html> <html lang"en"> <head><meta …

云架构(五)BBF模式

BFF模式&#xff08;Backends for Frontends pattern&#xff09;- https://learn.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends。 创建单独的后台服务用以提供给特定的前端或者接口。当你希望避免为多个接口定制单独的后台时&#xff0c;此模…