继承和派生

继承是面向对象编程语言的最重要方面之一,正确的使用继承可编写出设计良好,容易于维护和扩展的应用程序。下面是在其他博客中的总结:

******************************以下转载 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++程序世界------继承和派生的更多相关文章

  1. 走进C++程序世界-----继承和派生(2)

    覆盖基类的函数 覆盖基类函数顾名思义就是在派生类中对基类的函数进行的重新定义.这里将会讲到下面的2个知识点: 1.隐藏基类的方法 2.调用基类的方法(隐式和显示调用基类的方法) /* *derive2 ...

  2. 走进C++程序世界------异常处理

    一. 概述 C++自身有着很强的纠错能力,发展到现在,已经建立了比較完好的异常处理机制. C++的异常情况无非两种,一种是语法错误.即程序中出现了错误的语句,函数.结构和类,致使编译程序无法进行.还有 ...

  3. 走进C++程序世界-----函数相关(全局变量)

    全局变量 在函数外面定义的变量的作用域为全局,在程序的任何函数中都可用.与全局变量同名的局部变量不会修改全局变量的值,但会隐藏它.如果函数中有一个与全局变量同 名的局部变量时,则在函数中使用该名称时, ...

  4. 走进C++程序世界------IO标准库介绍

    流概述    流是C++标准的组成部分,流的主要目标是,将从磁盘读取文件或将输入写入控制台屏幕的问题封装起来,创建流后程序猿就能够使用它.流将负责处理全部的细节. IO类库 在C++输入、输出操作是通 ...

  5. 走进C++程序世界-------类的定义和使用(数据成员和方法成员,析构函数,构造函数,内联实现)

    类的成员简介 在C++中,可以通过声明一个类来穿件一种新的类型.类将一组变量(他们的类型通常不同)和一组相关的函数组合在一起.类可以有各种类型的变量组成,还可以包含其他类对象.成员变量称为数据成员它们 ...

  6. 走进C++程序世界-----operator new delete 重载

     在C++ 的世界里,new 和delete 是keyword.而在C的世界里相相应的malloc和free是函数,关键C++的new和delete分析,详见前面的章节.这里就不在过多的介绍了.链接. ...

  7. 程序设计实习MOOC / 继承和派生——编程作业 第五周程序填空题1

    描述 写一个MyString 类,使得下面程序的输出结果是: 1. abcd-efgh-abcd- 2. abcd- 3. 4. abcd-efgh- 5. efgh- 6. c 7. abcd- 8 ...

  8. [C#] 走进 LINQ 的世界

    走进 LINQ 的世界 序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串 ...

  9. 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/ ...

随机推荐

  1. linux下修改防火墙端口对外开放方法

    ---linix CentOS7的防火墙换成了firewall了,这里做一些记录,下面是一些命令:添加例外端口:# firewall-cmd --add-port=8080/tcp删除例外端口:# f ...

  2. HDU 1863:畅通project(带权值的并查集)

    畅通project Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. Rss 的作用 及使用方法

    也可以参考http://jingyan.baidu.com/article/e73e26c0c73e1f24adb6a70f.html 什么是RSS RSS是站点用来和其他站点之间共享内容的一种简易方 ...

  4. eclipse安装Flash Builder 4后变成中文,怎么解决

    修改eclipse.ini启动参数: -startup plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar --launcher.libr ...

  5. COM口,串行通讯端口,RS-232接口 基础知识

    COM口即串行通讯端口. COM口的接口标准规范和总线标准规范是RS-232,有时候也叫做RS-232口.电脑上的com口多为9针,最大速率115200bps.通常用于连接鼠标(串口)及通讯设备(如连 ...

  6. GridView控件中插入自定义删除按钮并弹出确认框

    GridView控件中插入自定义删除按钮,要实现这个功能其实有多种方法,这里先记下我使用的方法,以后再添加其他方法. 一.实现步骤 1.在GridView中添加模板列(TemplateField). ...

  7. SQL Server两种分页的存储过程介绍

          由于现在很多的企业招聘的笔试都会让来招聘的写一个分页的存储过程,有的企业甚至要求应聘者用两种方式实现分页,如果没有在实际项目中使用过分页,那么很多的应聘者都会出现一定的问题,下面介绍两种分 ...

  8. hadoop下载

    1.输入网址: http://mirrors.cnnic.cn/apache/hadoop/common/ 2.选择需要的版本进行点击下载

  9. Myeclipse中如何修改Tomcat的端口号

    一,使用 Myeclipse 中自带的 tomcat 右键 configure 弹出窗口 在 port Number 中修改 端口号即可: 二,配置的 tomcat 如果用上述的方法,只能打开这样的窗 ...

  10. PHP PSR-3 日志接口规范 (中文版)

    日志接口规范 本文制定了日志类库的通用接口规范. 本规范的主要目的,是为了让日志类库以简单通用的方式,通过接收一个 Psr\Log\LoggerInterface 对象,来记录日志信息. 框架以及CM ...