《c++ primer》第五版 第15章 面向对象程序设计

来源:互联网 发布:java snmp 内存 编辑:程序博客网 时间:2024/06/05 10:55

面向对象的程序设计基于三个基本概念:数据抽象,继承,动态绑定

数据抽象:将类的接口和实现分离

继承:定义相似的类型并对其相似关系进行建模

动态绑定:可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。

继承。基类。派生类。

基类希望它的派生类各自定义适合自身的版本,此时基类就将这些函数声明成虚函数。

派生类:派生类列表。

派生类必须在其内部对所有重新定义的虚函数进行声明,派生类可以在这样的函数之前加上virtual关键字,c++新标准允许派生类显式的注明它将使用哪个成员函数改写基类的虚函数。方法:在函数的形参列表之后增加一个override关键字。


动态绑定:运行时绑定。只有在具体运行的时候才知道调用的是基类还是派生类。

作为继承关系根节点的类通常都会定义一个虚析构函数。

基类希望其派生类进行覆盖的函数,即虚函数

基类希望派生类直接继承而不要改变的函数

任何构造函数之外的菲静态函数都可以是虚函数,virtual只能出现在类内部的声明语句之前而不能用于类外部的函数定义,如果基类把一个函数声明成虚函数,则该函数在派生类中隐式的也是虚函数。

派生类能访问共有成员,而不能访问私有成员。基类希望他的派生有权访问该成员,同时禁止其他用户访问,我们用受保护访问运算符说明这样的成员。

派生类必须将其继承而来的成员函数中需要覆盖的那些重新声明。

单继承:大多数类都只继承自一个类。

显式注明它使用某个成员函数覆盖他继承的虚函数。具体做法:在形参列表后面或者在const成员函数的const关键字后面,或者在引用成员函数的引用限定符后面添加一个关键字override

派生类含有从基类中继承而来的成员,但是派生类不能直接初始化这些成员,和其他创建了基类对象的代码一样,派生类也必须使用基类的构造函数来初始化他的积累部分。

每个类控制他自己的成员初始化的过程。

一般执行默认初始化,如果想要使用其他的基类构造函数,我们需要以类名加圆括号内的实参列表的形式为构造函数进行初始化,这些实参将帮助编译器决定应该选用哪个构造函数来初始化派生类对象的基类部分。

首先初始化积累部分,然后按照声明的顺序依此初始化派生类的成员。

如果基类定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义,不论从基类中派生出多少个派生类,对于每一个静态成员来说,都只有唯一一个实例。

假设某静态成员是可访问的,则我们既能通过基类使用他,也能通过派生类使用它。

对于派生类而言,其声明中包含类名,但是不能包含他的派生列表。

如果我们想将某个类用作基类,则该类必须已经定义而非仅仅声明。因为:(1)派生类中包含并且可以使用他从基类继承而来的成员,为了使用这些成员,派生类当然需要知道他们是什么,(2)一个类不能派生它本身。

防止继承发生:final!!!!

动态绑定:当我们使用基类的引用或指针调用一个虚成员函数时会执行动态绑定,因为我们直到运行时才能知道到底调用了哪个版本的函数

通常情况下,如果我们不使用某个函数可以不需要为该函数提供定义,但是我们必须为每一个虚函数都提供定义,而不管他是否被用到了,因为连编译器也无法确定到底会使用哪个虚函数。

动态绑定只有当我们通过指针或者引用调用虚函数的时候才会发生。,

oop核心思想:

多态性,

我们把具有继承关系的多个类型称作多态类型,因为我们使用这些类型的多种形式而无须在意他们的差异。

一旦一个函数被定义成了虚函数,则在所有派生类中她都是虚函数。

只有虚函数才能被覆盖。也可以指明为final,则之后的任何尝试覆盖该函数的操作都会发生错误。

注意:final和override说明符出现在形参列表以及尾置返回类型之后。

抽象基类:我们可以将其定义成纯虚函数。从而令程序实现我们的设计意图,一个纯虚函数无须定义。

定义纯虚函数的方法:=0

其中,=0,只能出现在类内部的虚函数声明语句处。

含有纯虚函数的类是抽象基类。抽象基类负责定义接口,而后续的其他类可以覆盖该接口。

我们不能直接创建一个抽象基类的对象,

protected:

用这个关键字来声明那些他希望与派生类分享但是不想被其他公共访问使用的成员,protected说明符可以看做是public和private中和之后的产物。

。。。。。。。

未完待续。。。。。。。。。
















0 0
原创粉丝点击