15面向对象程序设计

15面向对象程序设计

三个基本概念:数据抽象、继承和动态绑定。

15.1oop:概述

15面向对象程序设计_第1张图片

虚函数virtual:不继承基类,基类有,希望派生类定义自身的版本。为了显示表明派生类改写了基类的虚函数在该函数的形参之后增加一个override。

派生列表:

动态绑定:根据实参选择合适的函数版本(基类还是派生类的)进行执行,又称运行时绑定。

15.2定义基类和派生类

15.2.1定义基类

前者定义为虚函数,

15面向对象程序设计_第2张图片

派生类的其他用户是不能访问受保护的,只能派生类自己能够访问。

15.2.2定义派生类

派生列表,表明从哪继承,访问说明符是什么。访问说明符控制派生类从基类继承而来的成员是否对派生类的用户可见。

单继承。

通过在形参后增加override来表明覆盖基类的哪个虚函数。

派生类对象及派生类向基类的类型转换

城派生类到基类的类型转换。

派生类构造函数

基类中有的成员使用基类的构造函数初始化,派生类的自己初始化

15面向对象程序设计_第3张图片

被用作基类的类

必须依据定义而非仅声明;

一个类可以是基类也可以是派生类。

防止继承的发生final

在类名后加一个final。

15.2.3类型转换与继承

基类的指针或引用绑定到派生类对象上

静态类型和动态类型

15面向对象程序设计_第4张图片

在对象之间不存在类型转换

派生类向基类的自动类型转换只对指针或引用类型有效,在派生类类型和基类类型之中不存在这样的转换。

15面向对象程序设计_第5张图片

15.3虚函数

使用基类的引用或指针调用一个虚成员函数时会执行动态绑定,所有虚函数都必须定义。必须为每一个虚函数提供定义,而不管它是否被用到了,因为编译器也无法确定到底会使用哪个虚函数。

对虚函数的调用可能在运行是才被解析

15面向对象程序设计_第6张图片

派生类中虚函数

Virtual,一旦某个函数被声明成虚函数,则在所以的派生类中它都是虚函数。派生类中虚函数的形参必须与基类一致;返回类型也必须一致,例外情况:返回类型是类本身的指针或引用时。

Final和override

派生类定义了一个函数与基类虚函数名字相同但是形参列表不同,这是合法的,两个函数是相互独立的。

将某个函数指定为final(也可以用于函数),之后任何尝试覆盖该函数的操作都将引发错误。

回避虚函数机制

15.4抽象基类

纯虚函数

在函数体的位置(声明语句;之前)书写=0,说明此函数没有实际意义,无序定义。

其派生类可以创建对象。

派生类构造函数只初始化它的直接基类。

15面向对象程序设计_第7张图片

disc_quot是抽象基类。

15.5访问控制与继承

15面向对象程序设计_第8张图片
15面向对象程序设计_第9张图片
15面向对象程序设计_第10张图片

友元与继承

友元关系不能传递也不能继承,派生类的友元也不能随意访问基类的成员;

改变个别成员的可访问行

采用using声明。

15面向对象程序设计_第11张图片

15.6继承中的类作用域

在编译时进行名字查找

通过作用域运算符来使用隐藏的成员

15面向对象程序设计_第12张图片

一如往常,名字查找优先于类型检查

隐藏了就不能用了

覆盖重载的函数

如果派生类希望所有重载版本对他来说都是可见的,那么它就需要覆盖所有的版本,或者一个也不覆盖。

15.7构造函数与拷贝控制

15.7.1虚析构函数

我们通过在基类中将析构函数定义成虚函数以确保执行正确的析构函数版本。

15.7.2合成拷贝控制与继承

15面向对象程序设计_第13张图片

15.7.4继承的构造函数

15面向对象程序设计_第14张图片

继承的构造函数的特点

一个using声明不会改变该构造函数的访问级别

大多数派生类会继承所有基类的构造函数,两个例外情况,(1)派生类可以继承一部分构造函数,而为其他构造函数定义自己的版本。(2)是默认、拷贝和移动构造函数不会被继承。这些构造函数按照正常规则被合成。

15.8容器与继承

15面向对象程序设计_第15张图片

你可能感兴趣的:(15面向对象程序设计)