| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C++继承 -> 正文阅读 |
|
[C++知识库]C++继承 |
目录 class 子类的名称? : 继承权限 父类名称{?? ?//子类新增加的成员}; 一、继承的概念和定义1.继承的概念面试官:介绍下你所认识的继承? 答:继承的概念:继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类型的基础之上进行扩展,增加功能,这样产生的新类,称作派生类。继承呈现了面向对象设计的层次结构,体现了由简单到复杂的认知过程,以前我们接触的复用都是函数复用,继承是类设计层次的复用。 举例:例如动物就是一个类,而狗就是建立在动物这个类的基础之上创建的类,它继承了属于动物所共有的特点,又有自己所独有的特点,狗和动物就属于继承的关系,动物就是基类(父类),而狗就是派生类(子类)。 2.继承的定义2.1继承的格式要想创建子类,则必须先要有一个基类(父类)
2.2继承关系和访问限定符?2.3继承基类访问权限的变化总结:
二、基类和派生类对象的赋值转换一定是在public的继承方式下才满足下面的规则:1.可以直接用子类对象给基类对象赋值,但是反过来不可以(不能使用基类对象给子类对象赋值) 原因:1.public继承方式,子类和基类是is-a的关系,可以将子类对象看作是一个基类对象(狗一定是动物,动物不一定是狗) ? ? ? ? ? ?2.对象模型上来谈:对象中成员变量在内存中的布局形式上将其成为对象模型。 2.可以使用基类的指针指向的子类的对象,但是反过来不可以(不能直接使用子类的指针指向基类的对象) ?? 3.可以使用基类的引用去引用子类的对象,但是反过来不可以(不能使用子类的引用去引用基类的对象) ?引用的底层也是指针,所以存在相同的问题,而且引用还不能强转。 三、继承中的作用域1.在继承体系中基类和派生类都有独立的作用域 2.子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问) 3.如果是成员函数的隐藏,只需要函数名相同就构成隐藏。 4.注意在实际中在继承体系里面最好不要定义同名的成员。 四、派生类的默认成员函数注意:子类在继承的时候不会继承基类的构造和析构函数 1.如果基类显示定义了构造函数,但是基类的构造函数不是无参的或者全缺省的构造函数,此时子类必须要定义自己的构造函数,并且需要在其子类构造函数初始化列表位置显示调用基类的构造函数,目的:完成从基类中继承下来成员的初始化工作。 2.派生类的拷贝构造函数必须调用基类的拷贝构造函数完成基类的拷贝初始化。(建立在基类有拷贝构造函数的前提下),如果没有拷贝构造函数,则子类的拷贝构造函数可以定义也可以不定义。 3.派生类的operator=(赋值运算符的重载)必须调用基类的operator=完成基类的复制。 4.编译器将子类的析构函数编译完成之后,会在子类析构函数最后一条语句之后插入一条调用基类析构函数的汇编语句。 ?5.创建哪个类的对象,编译器就会调用该类的构造函数,析构哪个类的对象,编译器就会调用该类的析构函数。(子类创建的时候会在初始化列表中调用基类的构造函数,所以基类先被创造,但实则是先调用的子类的构造函数) 五、继承与友元友元关系不能继承,也就是说基类不能访问子类私有和保护成员。(你爸爸的朋友不一定是你的朋友!!)
六、继承与静态成员基类哪些成员被继承了? 1.成员变量 普通成员变量:基类所有的普通成员变量都被子类继承了 静态成员变量:被继承了(多个子类中拥有的是同一份静态成员变量,在整个继承体系中,静态成员只有一份) 2.成员函数 普通成员函数:基类所有的成员函数都被子类继承了(构造和析构除外) 静态成员函数:被继承了 默认成员函数:构造 拷贝构造 赋值运算符重载 析构函数(说法不一) 继承了,理由:在子类的中可以显示调用 没继承,理由:在类外无法调用 七、复杂的菱形继承及菱形虚拟继承1.C++中不同的继承体系单继承:一个子类只有一个父类 多继承:一个子类有用多个父亲 ?基类部分在上,子类部分在下,多个基类部分在子类对象中的次序和继承列表中基类出现的先后次序一致 注意:继承列表中每个基类前必须要加继承权限,否则就是默认的继承权限。 2.菱形继承面试中高频出现的问题: 什么是菱形继承?菱形继承存在什么问题?如何解决? 菱形继承:单继承+多继承 ?零星继承存在的问题:二义性问题+数据冗余
对象模型: ? ?最顶层基类B中成员在最下面D类中存在两份:一份是从C1中继承下来的,一份是从C2中继承下来的就导致:D类中将最顶层B中的成员出现了两份,如果直接通过D的对象,去访问最顶层基类中成员时,会出现访问不明确。 解决方法: 方式一:让访问明确化(加类名和作用域限定符的方式) ? 方式一并没有从根本上解决问题,只是让编译器知道访问哪个基类中的成员,最顶层基类中的成员在D中还是存在两份,比较浪费空间而且二义性问题本质还存在。 ?方式二:采用菱形虚拟继承,让最顶层基类中成员在D中只存在一份(解决数据冗余和根本上解决二义性) 先了解虚拟继承 虚拟继承和单继承区别? 1.对象模型是倒立的 2.对象多了4个字节 3.如果D没有显示定义构造函数,则编译器一定会生成,如果D定义了构造函数,则编译器一定会对构造函数进行修改 生成||修改的目的:往对象的前4个字节中填充数据。 虚拟继承真正的作用是用在菱形继承中解决菱形继承中存在的二义性问题 菱形虚拟继承解决菱形继承中二义性问题:让最顶层B类中的成员在D中只存储一份。 菱形继承代码+内存示意图:
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 20:14:38- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |