走进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/ ...
随机推荐
- [转]Laravel 4之请求
Laravel 4之请求 http://dingjiannan.com/2013/laravel-request/ 获取请求数据 获取当前请求所包括的所有GET和POST数据 Route::get(' ...
- 使用Reporting Service订阅对域外用户发邮件
默认情况下使用Reporting Service对域外邮件发送会失败,一般可能会碰到下面的两个错误: ERROR 1: Subscription Error: "The e-mail add ...
- Git 推送分支
1.推送本地分支到远程: git push origin master 推送本地分支 master 到 远程的 origin 上面 git push origin test 将本地分支test推 ...
- Ubuntu 系统 文件操作命令
文件和目录的操作 用户主目录下有一个 Desktop (对应,桌面)mkdir dir1 建立一个目录cd 不添加参数,默认回到主目录(用户目录)touch a.txt 建立一个文件mv a.txt ...
- Java中的编码格式
Java中的编码 gbk编码 中文占用2个字节,英文占1个字节; utf-8编码 中文占用3个字节.,英文占用1个字节; Java是双字节编码 (utf-16be) utf -16be 中文占2个字节 ...
- [转]CSS vertical-align属性详解 作者:黄映焜
CSS vertical-align属性详解 posted @ 2014-08-26 17:44 黄映焜 前言:关于vertical-align属性. 实践出真知. 垂直居中. 第二种用法. ...
- Chrome 开发者工具详解(2):Network 面板
面板上包含了Elements面板.Console面板.Sources面板.Network面板. Timeline面板.Profiles面板.Application面板.Security面板.Audit ...
- Webstrom 使用过程中遇到的问题以及解决方案
作为一个前端开发,我用过webstorm和sublime两个编辑器.sublime小巧轻便,不耗内存.但是webstorm具有以下特点,让我难以舍弃. webstorm优点 点击一个函数名,它会跳到函 ...
- Android 控件 -------- AutoCompleteTextView 动态匹配内容,例如 百度搜索提示下拉列表功能
AutoCompleteTextView 支持基本的自动完成功能,适用在各种搜索功能中,并且可以根据自己的需求设置他的默认显示数据.两个控件都可以很灵活的预置匹配的那些数据,并且可以设置输入多少值时开 ...
- php使用session来保存用户登录信息
php使用session来保存用户登录信息 使用session保存页面登录信息 1.数据库连接配置页面:connectvars.php <?php //数据库的位置 define('DB_HOS ...