走进C++程序世界------继承和派生
继承和派生
继承是面向对象编程语言的最重要方面之一,正确的使用继承可编写出设计良好,容易于维护和扩展的应用程序。下面是在其他博客中的总结:
******************************以下转载 http://blog.csdn.net/caijp1090/article/details/7484906******************
1、继承:保持已有类的特性而构造新类的过程;派生:在已有类的基础上新增自己的特性而产生新类的过程。
2、访问控制
a、公有继承public:基类的public和protected成员的访问属性在继承类中保持不变,但基类的private成员不可访问;派生类的成员可以直接访问基类的public和protected成员,但是不能访问基类的private成员;通过派生类的对象只能访问基类的public成员。
b、私有继承private:基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可以访问; 派生类中的成员函数直接访问基类中的public和protected成员,但不能访问基类的private成员; 通过派生类的对象不能访问基类中的任何成员。
c、保护继承protected:基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可访问;派生类的成员函数可以直接访问基类中的punlic和protected成员,但不能访问基类的private成员;派生类的对象不能访问基类中的任何成员。
3、protected成员特点:对于建立其所在类对象来说,他与private成员性质相同;对于其派生类来说,与public成员性质相同,既实现了数据隐藏又方便继承,实现代码重用。
4、基类与派生类的对应关系
a、单继承:派生类只从一个基类派生
b、多继承:派生类从多个基类派生==》class派生类名:继承方式1 基类名1,继承方式2 基类名2,......
c、多种派生:有一个基类派生出多个不同的派生类
d、多层派生:派生类又作为基类,继承派生新的类
5、派生类的构造、析构函数
a、基类的构造函数不被继承,需要在派生类中自行声明,声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化由基类完成。
==》单一继承时的构造函数:派生类名::派生类名(基类所需要的形参,本来成员所需要的形参):基类名(参数){本类成员初始化}
==》多继承时的构造函数:派生类名::派生类名(基类1形参,基类2形参,...基类n形参,本类形参):基类名1(参数)...基类名n(参数){本类成员初始化}
当基类中声明有缺省形式的构造函数或未声明构造函数时,派生类构造函数的声明中可以省略对基类构造函数调用;若基类中未声明构造函数,派生类中也可以不声明,全采用缺省形式构造函数;当基类声明有带形参的构造函数时,派生类也应声明带形参的构造函数,提供将参数传递给基类构造函数的途径。
==》多继承且有内嵌对象时的构造函数:派生类名::派生类名(基类1形参,基类2形参,...基类n形参,本类形参):基类名1(参数)...基类名n(参数),派生类对象数据成员的初始化{本类成员初始化}
构造函数的次序:调用基类构造函数,调用顺序按照他们被继承时声明的顺序(从左到右)--->调用成员对象的构造函数,调用顺序按照他们在类中声明的顺序--->派生类的构造函数体中的内容
b、继承时的析构函数
析构函数也不被继承,派生类自行声明;声明方法与一般(无继承关系时)类的析构函数相同;不需要显式地调用基类的析构函数,系统会自动隐式调用;调用次序与构造函数相反。相当于栈。
6、派生类成员的标识与访问
a、同名覆盖原则:当派生类与基类中有相同成员时,若未强行指名,则通过派生类对象使用的是派生类中的同名成员,如要通过派生类对象访问基类中被覆盖的同名成员应使用基类名限定。
b、在多继承时,基类与派生类之间,或基类之间出现同名成员时,将出现访问时的二义性(不确定性),采用虚函数或者支配(同名覆盖)原则解决。
c、在派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中成员时,将产生二义性,采用虚基类来解决。
7、虚基类
用于有共同基类的场合,以virtual修饰说明基类,主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题,为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝。但在第一次继承时就要将共同基类设计为虚基类,从而没有多次拷贝解决冗余的情况。
8、虚基类及其派生类构造函数
a、建立对象时所指定的类称为最(远)派生类
b、虚基类的成员是由最(远)派生类的构造函数通过调用虚基类的构造函数进行初始化的
c、在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用,如果未列出,则表示调用该虚基类的缺省构造函数。
d、在建立对象时,只有最(远)派生类的构造函数调用虚基类的构造函数,该派生类的其他基类对虚基类构造函数的调用被忽略。
9、赋值兼容原则
一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止,具体表现在:
a、派生类的对象可以被赋值给基类对象
b、派生类的对象可以初始化基类的引用
c、指向基类的对象的指针也可以指向派生类
************************************************************************************************************************************************
走进C++程序世界------继承和派生的更多相关文章
- 走进C++程序世界-----继承和派生(2)
覆盖基类的函数 覆盖基类函数顾名思义就是在派生类中对基类的函数进行的重新定义.这里将会讲到下面的2个知识点: 1.隐藏基类的方法 2.调用基类的方法(隐式和显示调用基类的方法) /* *derive2 ...
- 走进C++程序世界------异常处理
一. 概述 C++自身有着很强的纠错能力,发展到现在,已经建立了比較完好的异常处理机制. C++的异常情况无非两种,一种是语法错误.即程序中出现了错误的语句,函数.结构和类,致使编译程序无法进行.还有 ...
- 走进C++程序世界-----函数相关(全局变量)
全局变量 在函数外面定义的变量的作用域为全局,在程序的任何函数中都可用.与全局变量同名的局部变量不会修改全局变量的值,但会隐藏它.如果函数中有一个与全局变量同 名的局部变量时,则在函数中使用该名称时, ...
- 走进C++程序世界------IO标准库介绍
流概述 流是C++标准的组成部分,流的主要目标是,将从磁盘读取文件或将输入写入控制台屏幕的问题封装起来,创建流后程序猿就能够使用它.流将负责处理全部的细节. IO类库 在C++输入、输出操作是通 ...
- 走进C++程序世界-------类的定义和使用(数据成员和方法成员,析构函数,构造函数,内联实现)
类的成员简介 在C++中,可以通过声明一个类来穿件一种新的类型.类将一组变量(他们的类型通常不同)和一组相关的函数组合在一起.类可以有各种类型的变量组成,还可以包含其他类对象.成员变量称为数据成员它们 ...
- 走进C++程序世界-----operator new delete 重载
在C++ 的世界里,new 和delete 是keyword.而在C的世界里相相应的malloc和free是函数,关键C++的new和delete分析,详见前面的章节.这里就不在过多的介绍了.链接. ...
- 程序设计实习MOOC / 继承和派生——编程作业 第五周程序填空题1
描述 写一个MyString 类,使得下面程序的输出结果是: 1. abcd-efgh-abcd- 2. abcd- 3. 4. abcd-efgh- 5. efgh- 6. c 7. abcd- 8 ...
- [C#] 走进 LINQ 的世界
走进 LINQ 的世界 序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串 ...
- C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】
C#7.2——编写安全高效的C#代码 2018-11-07 18:59 by 沉睡的木木夕, 123 阅读, 0 评论, 收藏, 编辑 原文地址:https://docs.microsoft.com/ ...
随机推荐
- 新手使用ThinkPHP3.2.3的命名空间问题
ThinkPHP3.2.3的命名空间问题 命名空间的出现是为了避免命名冲突. 我们在TP3.2.3的Collection和Model的创建过程中经常会遇到这样的两行代码: 这是在控制器中的写法.其中n ...
- BZOJ 2648/2716(SJY把件-KD_Tree)[Template:KD_Tree]
2648: SJY把件 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 1180 Solved: 391 [id=2648" style= ...
- CDN云主机与传统虚拟主机功能对比
CDN云主机与传统虚拟主机功能对比 传统的虚拟主机都是单台服务器,一旦机器硬件损坏.IP被封.机房网络故障等,都将导致网站不能访问,严重的情况数据还无法及时取回,即使想换一家服务商也因为没有数据而无能 ...
- HTML5 本地裁剪图片并上传至服务器(转)
很多情况下用户上传的图片都需要经过裁剪,比如头像啊什么的.但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁剪坐标,发送给服务器,服务器裁剪完再返回给用户,来回需要 ...
- CSS筛选器简单实例1
1.通配符 <!--筛选器---通配符实例--> <!--支持IE7+ --> <style type="text/css"> *.all { ...
- json的js和C#操作
C#端的WebService接口接收json格式数据,处理后以json格式返回result using System; using System.Collections.Generic; using ...
- block中无法使用C数组变量
在Objective-C的block中无法使用C数组,即使我们不对C数组做任何改变,编译的时候也会报错: #include <stdio.h> int main() { const cha ...
- new String(byte[])和byte[]toString() 的区别
byte[]字节数组的toString()获得的字符串和使用new String(byte[])构造一个新的字符串,这两个字符串是不一样的.Java对象都继承于Object,Object中提供了toS ...
- WordPress插件制作教程(一): 如何创建一个插件
上一篇还是按照之前的教程流程,写了一篇WordPress插件制作教程概述,从这一篇开始就为大家具体讲解WordPress插件制作的内容.这一篇主要说一下插件的创建方法. 相信大家都知道插件的安装文件在 ...
- NET Core开发-获取所有注入(DI)服务
NET Core开发-获取所有注入(DI)服务 获取ASP.NET Core中所有注入(DI)服务,在ASP.NET Core中加入了Dependency Injection依赖注入. 我们在Cont ...