走进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/ ...
随机推荐
- web项目的两个创建形式website和webapplication
前言 在利用VS2010创建web项目的时候,会有两个选择.可以选择直接创建website网站,还可以选择使用 webapplication应用程序.刚刚接触web开发,看到这两个就疑惑了,既然是都可 ...
- drwtsn32.exe 遇到问题须要关闭。我们对此引起的不便表示抱歉
我的机器老是这样.启动起来就有这个... 那位高手能告诉我这是怎么会事.故障的原因以及解决的办法. 最佳答案 drwtsn32.exe是windows的一项磁盘检查程序,同一时候也是鸡肋程序,最好的办 ...
- [HeadFirst-HTMLCSS入门][第十章div,span]
新元素 <div>逻辑容器 能进行分组,等于用一个大的盒子进行包装 <span> 内联字符的逻辑分组 text-align 改变所有内联元素位置. 属性 center 居中 行 ...
- Entity Framework 6.1-Code First【转】
Entity Framework 6.1-Code First 分类: Entity Framework 2014-04-21 14:56 2034人阅读 评论(0) 收藏 举报 entityen ...
- contentSize、contentInset和contentOffset
contentSize.contentInset和contentOffset 是 scrollView三个基本的属性. contentSize: The size of the content vie ...
- 内存泄露分析 打开run static analyzer
- 及格率 不谢 cast(cast (sum(case when res>=60 then 1 else 0 end)*100/(count(1)*1.0) as float) as nvarchar)+'%' '及格率'
--18.查询各科成绩最高分.最低分和平均分:--以如下形式显示:-- 课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率--及格为>=60,中等为:70-80,优良 ...
- Python学习笔记2(控制语句)
1.if条件语句 if(表达式): 语句1 else: 语句2 2.if...elif...else判断语句 if(表达式1):语句1 elif(表达式2):语句2 ... elif(表达式n):语句 ...
- 何时可以开启透明数据加密(TDE)?
TDE可以为我们的数据库提供加密保护,但是,不是任何情况下都可以随意开启TDE的,同时开启TDE后,我们的数据库维护管理工作也需要进行一些调整. 下面我们就先看看开启TDE需要的条件吧! 无法正常开启 ...
- HibernateTemplate用法
private HibernateTemplate hibernateTemplate; 使用HbernateTemplate HibernateTemplate提供持久层访问模板化,使用Hibern ...