15面向对象程序设计
三个基本概念:数据抽象、继承和动态绑定。
15.1oop:概述
虚函数virtual:不继承基类,基类有,希望派生类定义自身的版本。为了显示表明派生类改写了基类的虚函数在该函数的形参之后增加一个override。
派生列表:
动态绑定:根据实参选择合适的函数版本(基类还是派生类的)进行执行,又称运行时绑定。
15.2定义基类和派生类
15.2.1定义基类
前者定义为虚函数,
派生类的其他用户是不能访问受保护的,只能派生类自己能够访问。
15.2.2定义派生类
派生列表,表明从哪继承,访问说明符是什么。访问说明符控制派生类从基类继承而来的成员是否对派生类的用户可见。
单继承。
通过在形参后增加override来表明覆盖基类的哪个虚函数。
派生类对象及派生类向基类的类型转换
城派生类到基类的类型转换。
派生类构造函数
基类中有的成员使用基类的构造函数初始化,派生类的自己初始化
被用作基类的类
必须依据定义而非仅声明;
一个类可以是基类也可以是派生类。
防止继承的发生final
在类名后加一个final。
15.2.3类型转换与继承
基类的指针或引用绑定到派生类对象上
静态类型和动态类型
在对象之间不存在类型转换
派生类向基类的自动类型转换只对指针或引用类型有效,在派生类类型和基类类型之中不存在这样的转换。
15.3虚函数
使用基类的引用或指针调用一个虚成员函数时会执行动态绑定,所有虚函数都必须定义。必须为每一个虚函数提供定义,而不管它是否被用到了,因为编译器也无法确定到底会使用哪个虚函数。
对虚函数的调用可能在运行是才被解析
派生类中虚函数
Virtual,一旦某个函数被声明成虚函数,则在所以的派生类中它都是虚函数。派生类中虚函数的形参必须与基类一致;返回类型也必须一致,例外情况:返回类型是类本身的指针或引用时。
Final和override
派生类定义了一个函数与基类虚函数名字相同但是形参列表不同,这是合法的,两个函数是相互独立的。
将某个函数指定为final(也可以用于函数),之后任何尝试覆盖该函数的操作都将引发错误。
回避虚函数机制
15.4抽象基类
纯虚函数
在函数体的位置(声明语句;之前)书写=0,说明此函数没有实际意义,无序定义。
其派生类可以创建对象。
派生类构造函数只初始化它的直接基类。
disc_quot是抽象基类。
15.5访问控制与继承
友元与继承
友元关系不能传递也不能继承,派生类的友元也不能随意访问基类的成员;
改变个别成员的可访问行
采用using声明。
15.6继承中的类作用域
在编译时进行名字查找
通过作用域运算符来使用隐藏的成员
一如往常,名字查找优先于类型检查
隐藏了就不能用了
覆盖重载的函数
如果派生类希望所有重载版本对他来说都是可见的,那么它就需要覆盖所有的版本,或者一个也不覆盖。
15.7构造函数与拷贝控制
15.7.1虚析构函数
我们通过在基类中将析构函数定义成虚函数以确保执行正确的析构函数版本。
15.7.2合成拷贝控制与继承
15.7.4继承的构造函数
继承的构造函数的特点
一个using声明不会改变该构造函数的访问级别
大多数派生类会继承所有基类的构造函数,两个例外情况,(1)派生类可以继承一部分构造函数,而为其他构造函数定义自己的版本。(2)是默认、拷贝和移动构造函数不会被继承。这些构造函数按照正常规则被合成。
15.8容器与继承
网友评论