高程 | 继承与派生(c++)

这篇具有很好参考价值的文章主要介绍了高程 | 继承与派生(c++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

📚继承的概念和语法

  • ⭐️概念
    • 类的继承,是新的类从已有类那里得到已有的特性
    • 类的派生,从已有类产生新类的过程
    • 原有的类称为基类或父类,产生的新类称为派生类或子类。
    • 直接参与派生出某类的基类称为直接基类,基类的基类甚至更高层的基类称为间接基类。
  • ⭐️语法
    • class 派生类名:[继承方式] 基类名{undefined 派生类新增加的成员};
      • 若是多继承则有class 派生类名:继承方式1 基类名1,继承方式2 基类名2,…
      • 每一个“继承方式”,只用于限制对紧随其后之基类的继承。
    • 基类是已有类的名称。
    • 派生类是继承原有类的特性生成的新类的名称。
    • 继承方式包括 public(公有的)、private(私有的)和 protected(受保护的),此项是可选的,如果不写,那么默认为 private。

📚派生类生成过程

  • ⭐️吸收基类成员:吸收基类成员之后,派生类实际上就包含了它的全部基类中除构造和析构函数之外的所有成员。
  • ⭐️改造基类成员
    • 访问控制问题,由定义时的继承方式控制。
    • 覆盖隐藏
      • 如果派生类中的成员(包括成员变量和成员函数)和基类中的成员重名,那么就会遮蔽从基类继承过来的成员。
      • 所谓遮蔽,就是在派生类中使用该成员(包括在定义派生类时使用,也包括通过派生类对象访问该成员)时,实际上使用的是派生类新增的成员,而不是从基类继承来的。
      • 基类成员函数和派生类成员函数不构成重载
        • 基类成员和派生类成员的名字一样时会造成遮蔽,这句话对于成员变量很好理解。
        • 对于成员函数,不管函数的参数如何,只要名字一样就会造成遮蔽。换句话说,基类成员函数和派生类成员函数不会构成重载,如果派生类有同名函数,那么就会遮蔽基类中的所有同名函数,不管它们的参数是否一样
    • 如果在派生类中需要且仅需要重写其中一个重载函数,该如何操作?
      • 通过using在派生类中为父类函数成员提供声明 即添加 “ using Base::print; ”
      • 通过基类指针调用(进阶办法:把在派生类中需要重载的那个版本相应地在基类中声明为vitual)
  • ⭐️添加新的成员:在定义时直接添加就好。

📚继承权限和继承方式

  • 不同继承方式的影响主要体现在:
    • 派生类成员对基类成员的访问权限。
    • 通过派生类对象对基类成员的访问权限。

🐇公有继承

  • 基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。
  • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。
  • 通过派生类的对象只能访问基类的public成员。

🐇私有继承

  • 基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。
  • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。
  • 通过派生类的对象不能直接访问基类中的任何成员。

🐇保护继承

  • 基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。
  • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。
  • 通过派生类的对象不能直接访问基类中的任何成员。
  • 特点和作用
    • 对建立其所在类对象的模块来说,它与 private 成员的性质相同。这意味着只有在类内部或者友元函数中才能访问保护继承的成员。这样可以实现数据隐藏,防止外部模块直接访问变量或函数。
    • 对于其派生类来说,它与 public 成员的性质相同。这意味着派生类可以直接访问和使用保护继承的成员,但是对外部模块来说是不可见的。这样可以方便继承,派生类可以重用保护继承的成员,实现代码的重用。既实现了数据隐藏,又方便继承,实现代码重用。

高程 | 继承与派生(c++),# 数据结构笔记合集,数据结构、算法与应用,c++,java
高程 | 继承与派生(c++),# 数据结构笔记合集,数据结构、算法与应用,c++,java


⭐️private, public, protected 三类访问标号的访问范围

  • private属性:
    • 只能由①该类中的函数、②其友元函数访问。
    • 该类的对象不能访问。
  • protected属性:
    • 可以被①该类中的函数、②子类的函数、以及③其友元函数访问。
    • 该类的对象不能访问。
  • public属性:
    • 可以被①该类中的函数、②子类的函数、以及③其友元函数访问。
    • 该类的对象可以访问。
  • 无论是哪种继承方式,基类的私有成员在派生类中都是不可被访问的。只能通过基类的成员函数访问基类的私有数据成员。 如果在一个派生类中要访问基类中的私有成员,可以将这个派生类声明为基类的友元。

📚类型转换规则

  • 一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:
    • 派生类的对象可以隐含转换为基类对象。
    • 派生类的对象可以初始化基类的引用。
    • 派生类的指针可以隐含转换为基类的指针。
  • 通过基类对象名、指针只能使用从基类继承的成员。

📚派生类构造函数和析构函数

  • 基类的成员函数可以被继承,可以通过派生类的对象访问;
  • 类的构造函数不能被继承。在派生类的构造函数中调用基类的构造函数。Student::Student(char *name, int age, float score): People("小明", 16), m_score(score){ }
  • 派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的
    • 当基类中没有显式定义构造函数,或定义了无参构造函数时,派生类构造函数的初始化表可以省略对基类构造函数的调用,而采用隐含调用。
    • 当基类的构造函数使用一个或多个参数时,派生类必须定义构造函数,提供将参数传递给基类构造函数的途径。
    • 定义构造函数时,需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,自动调用基类构造函数完成。这时,派生类构造函数的函数体可能为空,仅起到参数传递作用。
    • 如果在基类中既定义了无参构造函数,又定义了带参构造函数,则在定义派生类构造函数时,既可以包含基类构造函数和参数,也可以不包含基类构造函数。

  • 和构造函数类似,析构函数也不能被继承。(不用程序员显示调用、编译器负责)
  • ⚠️执行顺序
    • 基类构造函数的调用顺序是按照派生类定义时的顺序。
    • 内嵌对象的构造函数调用顺序是按照成员在类中声明的顺序。
    • 先执行基类构造函数,再执行内嵌对象的构造函数。
    • 而销毁派生类对象时,析构函数的执行顺序和继承顺序相反,即先执行派生类析构函数,再执行基类析构函数。

📚继承中的静态成员特性

  • 均被继承到派生类中。
  • 重新定义静态成员函数,基类中的其他函数会被隐藏。
  • 改变基类中的一个函数特征(返回值、参数个数),则使用该函数名的基类版本均会被隐藏。

📚虚继承和虚基类

  • 多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。(容易产生问题,命名冲突。)
    高程 | 继承与派生(c++),# 数据结构笔记合集,数据结构、算法与应用,c++,java

  • 虚继承(Virtual Inheritance)为了解决多继承时的命名冲突和冗余数据问题,C++ 提出了虚继承,使得在派生类中只保留一份间接基类的成员。在继承方式前面加上virtual关键字就是虚继承。文章来源地址https://www.toymoban.com/news/detail-827346.html

    • 形式举例
      • 间接基类A:class A{protected: int m_a;};
      • 直接基类B:class B: virtual public A{ //虚继承protected: int m_b;};
    • 虚继承的目的:让某个类做出声明,承诺愿意共享它的基类。其中,这个被共享的基类就称为虚基类(Virtual Base Class)
    • 虚继承时的构造函数:
      • 虚继承中,虚基类是由最终的派生类初始化的,换句话说,最终派生类的构造函数必须要调用虚基类的构造函数。对最终的派生类来说,虚基类是间接基类,而不是直接基类。
      • 这跟普通继承不同,在普通继承中,派生类构造函数中只能调用直接基类的构造函数,不能调用间接基类的。
    • 关于虚继承的说明
      • 当使用虚继承时,虚基类是共享的,无论被继承多少次,对象内存中只有一个虚基类子对象。其初始化也只能由一个类初始化一次。
      • C++标准中要求每次继承之类中均需要写初始化语句,但虚基类的初始化是由最后的子类完成,其他初始化子类均不会调用。

到了这里,关于高程 | 继承与派生(c++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【浅尝C++】继承机制=>虚基表/菱形虚继承/继承的概念、定义/基类与派生类对象赋值转换/派生类的默认成员函数等详解

    🏠专栏介绍:浅尝C++专栏是用于记录C++语法基础、STL及内存剖析等。 🎯每日格言:每日努力一点点,技术变化看得见。 我们生活中也有继承的例子,例如:小明继承了孙老师傅做拉面的手艺。继承就是一种延续、复用的方式。C++为了提高代码的可复用性,引入了继承机制,

    2024年04月10日
    浏览(38)
  • 头歌Educoder实验:C++ 面向对象 - 类的继承与派生

    第1关:公有继承 —— 学生信息类 任务描述 本关任务:采用公有继承设计学生信息类。 相关知识 继承 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。简单的说,继承是指一个对象直接使用另一对象的属性和方法。 C++ 中的继承关系就好比现实生

    2024年02月04日
    浏览(108)
  • 数据结构笔记(c++版,期末复习)

      目录 一、绪论 1.数据结构基本概念 2.算法定义与特征 二、线性表 1.线性表的定义 2.顺序表的存储结构 3.链式存储结构 三、栈和队列 1、栈的基本概念 2.队列的基本概念 3.循环队列  四、字符串和多维数组 1.字符串的基本概念 2.串的简单模式匹配 3.多维数组 3.1数组的定义

    2024年02月12日
    浏览(36)
  • 【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)

    前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象’ ,也了解了C++中的模版,以及学习了几个STL的结构也相信大家都掌握

    2024年02月11日
    浏览(34)
  • <c++> 类的继承 | 基类与派生类 | 构造函数与析构函数

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 从零开始的 c++ 之旅 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪 c++ 面向对象三大特性: 封装,继承,多态 。通过本文我们将了解什么是类的

    2023年04月20日
    浏览(38)
  • 数据结构(c++语言版) 邓俊辉 第五章:二叉树学习笔记

    5.1二叉树及其表示         树是由节点和边组成的。 1.有根树         树是由顶点(vertex)和边(edge)组成。树的每个顶点也叫节点(node)。 2.深度与层次         由树的连通性,每一节点与根都有一条路径相连:根据树的无环性,由根通往每个节点的路径必然唯一。  

    2024年02月13日
    浏览(34)
  • 算法 数据结构分类 数据结构类型介绍 数据结构线性非线性结构 算法合集 (一)

     数据结构分为:                            a.线性结构                            b.非线性结构  a.线性结构:                       数据与结构存在一对一的线性关系; a . 线性结构 存储 分为:                                   顺序存储

    2024年02月10日
    浏览(36)
  • 【数据结构】排序合集(万字详解)

    排序,以字面意思来说就是通过特定的算法将一组或多组无序或者接近有序的数据,以升序或者降序的方式重新进行排序组合; [7,4,2,9,8,6,5,1,3]; 以升序的方式进行排序最终为: [1,2,3,4,5,6,7,8,9]; 排序算法就是如何使得数据按照要求排列的方法; 排序的算法多种多样,基本的排序

    2024年02月08日
    浏览(27)
  • 【C++】面向对象编程(二)面向对象的编程思维:virtual虚拟调用、继承、protected成员、派生类与基类

    默认情形下,成员函数的解析都是编译时静态进行。如果要让成员函数的解析在程序运行时动态进行,需要在成员函数的声明前加上virtual: 虚函数的作用: 用基类的指针指向不同的派生类的对象时,基类指针调用其虚成员函数,会调用 真正指向对象的成员函数 ,而

    2024年02月07日
    浏览(35)
  • 【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】

    前言 大家好吖,欢迎来到 YY 滴C++考前速过系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《

    2024年01月17日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包