Essential C++ 读书笔记 Ch5

5 面向对象编程风格

5.1 概念

面向对象编程概念的最主要两项特质是: 继承inheritance和多态polymorphism。
动态绑定 dynamic binding 是面向对象编程风格的第三个独特概念。

5.2 面向对象编程思维

默认情形下,member function的解析皆在编译时静态运行。若要令其在运行时动态进行,我们就得再它的声明前加上关键字virtual。
使用派生类时,不必刻意区分“继承而来的类成员”和“自身定义的类成员”。两者的使用完全透明。

5.3 不带继承的多态

5.4 定义一个抽象基类

定义抽象类的第一个步骤就是找出所有子类共通的操作行为。
设计抽象基类的下一步,便是设法找出哪些操作行为与类型相关——也就是说,有哪些操作行为必须根据不同的派生类而有不同的实现方式。这些操作行为应该成为整个类继承体系中的虚函数
static member function无法被声明为虚函数
设计抽象基类的第三步,便是试着找出每个操作行为的访问层级access level
即使是某个基类的派生类,也无法访问基类的private member
每个虚函数,要么得有其定义,要么可以设为纯虚函数
任何类,如果声明有一个或一个以上纯虚函数,那么,由于其接口的不完整性,程序无法为它产生任何对象
根据一般规则,凡基类定义一个或多个虚函数,应该将其destructor声明为virtual
non-virtual函数在编译时便已完成解析

5.5 定义一个派生类

派生类的名称之后紧跟着冒号,关键字public,以及基类的名称。
类进行继承声明之前,其基类的定义必须已经存在。
子类必须为从基类继承的每个纯虚函数提供对应的实现。
如果派生类声明了non-virtual function,因为它们并非基类提供的接口的一员,所以当我们通过基类的pointer或reference进行操作时无法访问这些函数。
派生类的虚函数必须精确吻合基类中的函数原型。在类之外对虚函数进行定义时,不必指明关键字virtual。
继承而来的public成员和protected成员,无论在继承体系中的深度如何,都会被视为派生类自身的成员。基类中protected的成员,在派生类中同样也是protected成员。
一般而言,在派生类和基类中定义同名的non-virtual函数,并不是好主意。派生类欲检查自身状态的完整性时,已实现完成的基类缺乏足够的知识。

5.6 运用继承体系

5.7 基类应该多么抽象

Data member如果是个reference,必须在constructor的member initialization list 中加以初始化。

5.8 初始化、析构、复制

应该为基类提供constructor,并利用这个constructor处理基类所声明的所有data member的初始化操作。
派生类对象的初始化行为,包含调用其基类的constructor,然后再调用派生类自己constructor
作为派生类的constructor,不仅必须为派生类的data member进行初始化操作,还需要为其基类的data member提供适当的值。

5.9 在派生类中定义一个虚函数

“返回类型必须完全吻合”规则的例外————当基类的虚函数返回某个基类形式(通常是pointer或reference形式)时:派生类中同名函数便可以返回该基类所派生出来的类型。
在基类的constructor之中,派生类的虚函数绝不会被调用。
为了能够在单一对象中展现多种类型,多态polymorphism需要一层间接性。C++中,唯有用基类的pointer和reference才能够支持面向对象编程概念。

5.10 运行时的类型鉴定机制

待补充。

posted @ 2021-10-26 23:02  柚子z  阅读(65)  评论(0)    收藏  举报