类的继承

保持已有类的特性而构造新类的过程称为继承;

实现设计与代码的重用.

在已有类的基础上新增自己的特性而产生新类的过程称为派生

当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造

派生类的构成

吸收基类成员

  • 默认情况下派生类包含了全部基类中除构造和析构函数之外的所有成员;
  • C++11规定可以用using语句继承基类构造函数。

改造基类成员

  • 如果派生类声明了一个和某基类成员同名的新成员,派生的新成员就隐藏或覆盖了外层同名成员

添加新的成员

  • 派生类增加新成员使派生类在功能上有所发展

继承方式

区别

派生类成员派生类对象对基类成员的访问权限

三种继承方式的共同点:

  • 派生类中的成员函数:可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员(唯一的限制);
  • 对基类的private成员的唯一访问方式就是调用基类自身的私有成员访问接口,接口是public或者protected成员.

公有继承(public)

  • 在派生类中身份不变;
  • 通过派生类的对象:只能访问基类public成员。

私有继承(private)

  • 全部私有化;
  • 通过派生类的对象:不能直接访问从基类继承的任何成员。

保护继承(protected)

  • public成员被保护起来;
  • 通过派生类的对象:不能直接访问从基类继承的任何成员。

protected 成员的特点与作用

  • 对建立其所在类对象的模块来说,它与 private 成员的性质相同。
  • 对于其派生类成员函数来说,它与 public 成员的性质相同。
  • 既实现了数据隐藏,又方便继承,实现代码重用。
  • 适应于基类和派生类均为同一团队所设计时;

继承的实用性总结:

  • 对于派生类内部来说:基类私有成员被保护了,其他的都能看;
  • 对于派生类对象来说:
  1. 能使用基类public成员------>public继承时;
  2. 不能使用基类public成员---->private和protected继承时;

类型转换

公有派生类对象可以被当作基类的对象使用,反之则不可。

  • 派生类的对象可以隐含转换为基类对象;
  • 派生类的对象可以初始化基类的引用;
  • 派生类的指针可以隐含转换为基类的指针。

通过基类对象名、指针只能使用从基类继承的成员。

指向基类类型的指针,你给它派生类对象的地址,只会从派生类中寻找基类传下来的那些成员,派生类的新成员会被忽略。

派生类的构造函数

派生类的构造函数需要给基类的构造函数传递参数;

p.s.当基类有默认构造函数时,也可以不传参数;
派生类名::派生类名(形参表):
基类名1(参数), 基类名2(参数), ..., 基类名n(参数),
本类成员(含对象成员)初始化列表
{
//其他初始化
}; class Derived: public Base2, public Base1, public Base3 {
public:
Derived(int a, int b, int c, int d): Base1(a), member2(d), member1(c),
Base2(b)
//此处的次序与构造函数的执行次序无关
{ }
private:
Base1 member1;
Base2 member2;
Base3 member3;
}

派生类复制构造函数

给基类传派生类对象的引用;

Line::Line(const Line &p): Point(p) {…}

访问从基类继承的成员

当派生类与基类中有相同成员时:

  • 通过派生类对象使用的是派生类中的同名成员;(同名隐藏)
  • 如要通过派生类对象访问基类中被隐藏的同名成员,应使用基类名和作用域操作符(::)来限定
// Derived 继承自 Base1 和 Base2
Derived d;
Derived *p = &d; d.fun();
d.Base1::fun();
p->Base2::fun();

二义性问题

  • 如果从不同基类继承了同名成员,但是在派生类中没有定义同名成员,“派生类对象名或引用名.成员名”、“派生类指针->成员名”访问成员存在二义性问题;
  • 解决方式:用类名限定
Derived d;
d.Base1::fun0();
d.Base2::fun0();

虚基类

解决的问题

当派生类从多个基类派生,而这些基类又共同基类,则在访问此共同基类中的成员时,将产生冗余,并有可能因冗余带来不一致性

作用

  • 主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题
  • 为最远的派生类提供唯一的基类成员,而不重复产生多次复制

在第一级继承时就要将共同基类设计为虚基类

class  B...
class B1:virtual public B
class B2:virtual public B
class b:public B1,public B1
  1. 建立对象时所指定的类称为最远派生类;
  2. 所有派生类要在初始化列表中给虚基类传参数;(没传则用默认构造函数)
  3. 在建立对象时,只有最远派生类的构造函数调用虚基类的构造函数,其他类对虚基类构造函数的调用被忽略。
b(int var) : B(var), B1(var), B2(var)

清华大学《C++语言程序设计进阶》线上课程笔记06---继承、派生、多态性的更多相关文章

  1. 清华大学《C++语言程序设计基础》线上课程笔记02---类与对象

    类与对象 public是类的对外访问接口: 类内初始值 在定义类时对数据成员写初始值,在创建对象的时候,会使用类内初始值初始化数据成员: class Clock { public: void show ...

  2. 清华大学《C++语言程序设计基础》线上课程笔记03---数据的共享和保护&数组

    数据的共享和保护 对象的生存期 static类型的局部变量,生存期在整个程序,局部可见. void example() { static a=1; int b=2 } 当调用完example函数后,b ...

  3. 清华大学《C++语言程序设计基础》线上课程笔记05---vector对象,对象的复制与移动,string类

    vector 对象 C++标准库中的一个类模板 封装任何类型的动态数组,自动创建和删除. 数组下标越界检查. 将动态数组封装成类的知识点中封装的ArrayOfPoints也提供了类似功能,但只适用于一 ...

  4. 清华大学《C++语言程序设计基础》线上课程笔记04---指针

    指针 static int i; static int* ptr = &i; 此处的*表示ptr是指针类型(地址类型),用来存放目标数据的地址 其本身也有地址,所以又指向指针的指针; *前面的 ...

  5. 清华大学《C++语言程序设计基础》线上课程笔记01---基础概念与一些注意事项

    使用除法的注意事项 double b = 4.0 * 1/239.0; 因为整数相除结果取整,如果参数写1/239,结果就都是0 浮点数注意事项 浮点数是近似存储,所以不能直接比较两个浮点数的大小, ...

  6. 软件工程线上课程(C语言实践篇)学习心得总结

    林牧 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com/course/USTC-1000002006 软件工程的理 ...

  7. 欢迎参加MVP主讲的Windows 10开发线上课程

    博客地址:http://blog.csdn.net/FoxDave Windows 10 Developer Readiness - Powered by MVPs - 由微软最有价值专家(MVP)主 ...

  8. 《Python自动化测试修炼宝典》线上课程已经成功入驻网易云课堂......

    <Python自动化测试修炼宝典>线上课程已经成功入驻网易云课堂...... IT测试老兵利用工作之余,亲自录制的<Python自动化测试修炼宝典>线上课程已经成功入驻网易云课 ...

  9. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

随机推荐

  1. 大数据学习---大数据的学习【all】

    大数据介绍 什么是大数据以及有什么特点 大数据:是指无法在一定时间内用常规软件工具对其内容进行抓取.管理和处理的数据集合. 大数据是一种方法论:“一切都被记录,一切都被数字化,从数据中寻找需求,寻找知 ...

  2. redis外网连接的一些坑

    前言 在使用阿里云和腾讯云的redis 可以减少很大的维护量.但是在我们的业务场景中遇到了一个情况,阿里和腾讯的redis均不支持外网访问.因此,正好帮人解决一个问题,就拿出来分享一下. 阿呆的故事 ...

  3. simotion连接 V90 1FL6 增量型电机,报警20025 编码器细分设置

    V90 1FL6 增量型电机 The configured fine resolution for Gx_XIST1 (Encoder_N.absEncoder.absResolutionMultip ...

  4. 2维FFT算法实现——基于GPU的基2快速二维傅里叶变换

    上篇讲述了一维FFT的GPU实现(FFT算法实现——基于GPU的基2快速傅里叶变换),后来我又由于需要做了一下二维FFT,大概思路如下. 首先看的肯定是公式: 如上面公式所描述的,2维FFT只需要拆分 ...

  5. 使用NPOI进行Excel数据的导入导出

  6. SAP CRM settype的创建,背后发生了什么

    来自我的同事Sara. 当我们在CRM系统里创建一个settype之后,其实系统后台悄悄的帮我们创建了很多ABAP对象,比如对应的database tables, other ABAP Diction ...

  7. 利用Kali进行WiFi钓鱼测试实战

    文中提及的部分技术可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使用.请不要做一只咖啡馆里安静的猥琐大叔. 写在前面 从至少一年前我就一直想在自己跑kali的笔记本上架个钓鱼热点.然而由于网上的 ...

  8. 一直在用的一个javascript网站

    http://www.dottoro.com/ 很不错,例子丰富,解释详细,全面:非常好的参考资料站.

  9. shiro注解,初始化资源和权限,会话管理

     有具体问题的可以参考之前的关于shiro的博文,关于shiro的博文均是一次工程的内容  注解: 新建一个类: 此时需要有admin的权限才可以执行下面的代码 public class ShiroS ...

  10. 常用的css选择器

    1.最基本的 * * 选择所有元素. #id #firstname 选择 id="firstname" 的元素. .class .intro 选择 class="intr ...