第6讲类的继承与派生(上)
- 格式:ppt
- 大小:1.46 MB
- 文档页数:28


C++——类继承以及类初始化顺序
对于类以及类继承, ⼏个主要的问题:1) 继承⽅式: public/protected/private继承.
这是c++搞的, 实际上继承⽅式是⼀种允许⼦类控制的思想. ⼦类通过public继承, 可以把基类真实还原, ⽽private继承则完全把基类屏蔽掉.
这种屏蔽是相对于对象层⽽⾔的, 就是说⼦类的对象完全看不到基类的⽅法, 如果继承⽅式是private的话, 即使⽅法在基类中为public的⽅法.
但继承⽅式并不影响垂直⽅向的访问特性, 那就是⼦类的函数对基类的成员访问是不受继承⽅式的影响的.
⽐较(java): java是简化的, 其实可认为是c++中的public继承. 实在没必要搞private/protected继承, 因为如果想控制,就直接在基类控制就好了.
2) 对象初始化顺序: c++搞了个成员初始化列表, 并确明确区分初时化跟赋值的区别. c++对象的初始化顺序是:
(a) 基类初始化
(b) 对象成员初时化
(c) 构造函数的赋值语句
举例:
假设 class C : public A, public B {D d;//
}
则初始化的顺序是A, B, D, C的构造函数.
这⾥基类的初始化顺序是按照声明的顺序, 成员对象也是按照声明的顺序. 因此 c(int i, int j) : B(i), A(j) {} //这⾥成员初始化列表的顺序是不起作
⽤的;
析构函数的顺序则刚好是调过来, 构造/析构顺序可看作是⼀种栈的顺序;
⽐较(java): java中初始化赋值是⼀回事. ⽽且对基类的构造函数调⽤必须显⽰声明, 按照你⾃⼰写的顺序.
对成员对象, 也叫由你初始化.没有什么系统安排的顺序问题, 让你感觉很舒服;
3) 多继承问题: c++⽀持多继承, 会导致"根"不唯⼀. ⽽java则没有该问题;
此外c++没有统⼀的root object, java所有对象都存在Object类使得很多东西很⽅便. ⽐如公共的seriall, persistent等等.
C++中的封装、继承、多态理解
封装(encapsulation):就是将抽象得到的数据和⾏为(或功能)相结合,形成⼀个有机的整体,也就是将数据与操作数据的源代
码进⾏有机的结合,形成”类”,其中数据和函数都是类的成员。封装的⽬的是增强安全性和简化编程,使⽤者不必了解具体的
实现细节,⽽只是要通过外部接⼝,特定的访问权限来使⽤类的成员。封装可以隐藏实现细节,使得代码模块化。
继承(inheritance):C++通过类派⽣机制来⽀持继承。被继承的类型称为基类或超类,新产⽣的类为派⽣类或⼦类。保持已有
类的特性⽽构造新类的过程称为继承。在已有类的基础上新增⾃⼰的特性⽽产⽣新类的过程称为派⽣。继承和派⽣的⽬的是保
持已有类的特性并构造新类。继承的⽬的:实现代码重⽤。派⽣的⽬的:实现代码扩充。三种继承⽅式:public、protected、
private。
继承时的构造函数:(1)、基类的构造函数不能被继承,派⽣类中需要声明⾃⼰的构造函数;(2)、声明构造函数时,只需要对
本类中新增成员进⾏初始化,对继承来的基类成员的初始化,⾃动调⽤基类构造函数完成;(3)、派⽣类的构造函数需要给基
类的构造函数传递参数;(4)、单⼀继承时的构造函数:派⽣类名::派⽣类名(基类所需的形参,本类成员所需的形参):基类名(参
数表) {本类成员初始化赋值语句;};(5)、当基类中声明有默认形式的构造函数或未声明构造函数时,派⽣类构造函数可以不
向基类构造函数传递参数;(6)、若基类中未声明构造函数,派⽣类中也可以不声明,全采⽤缺省形式构造函数;(7)、当基类
声明有带形参的构造函数时,派⽣类也应声明带形参的构造函数,并将参数传递给基类构造函数;(8)、构造函数的调⽤次
序:A、调⽤基类构造函数,调⽤顺序按照它们被继承时声明的顺序(从左向右);B、调⽤成员对象的构造函数,调⽤顺序按照
它们在类中的声明的顺序;C、派⽣类的构造函数体中的内容。
继承时的析构函数:(1)、析构函数也不被继承,派⽣类⾃⾏声明;(2)、声明⽅法与⼀般(⽆继承关系时)类的析构函数相同;
继承与派生习题
C++讲义-第九章习题
一.选择题
1.下列对派生类的描述中,错误的是( )
A.一个派生类可以作为另一个派生类的基类。
B.派生类至少有一个基类。
C.派生类的成员除了它自己的成员之外,还包含了它的基类的成员。 D.派生类中继承的基类成员的访问权限到派生类保持不变。 2.派生类的对象对它的基类成员中,可以访问的是( )
A.公有继承的公有成员。
B.公有继承的私有成员。
C.公有继承的保护成员。 D.私有继承的公有成员。
3.对基类和派生类的关系描述中,错误的是( )
A.派生类是基类的具体化。
B.派生类是基类的子集。
C.派生类是基类定义的延续。 D.派生类是基类的组合。
4.派生类的构造函数的成员初始化列表中,不能包含的是( )
A.基类的构造函数。 B.派生类中子对象的初始化。
C.基类的子对象初始化。
D.派生类中一般数据成员的初始化。 5.关于子类型的描述中,错误的是( )
A.子类型就是指派生类是基类的子类型。
B.一种类型当它至少提供了另一种类型的行为,则这种类型是另一种类型的子类型。
C.在公有继承下,派生类是基类的子类型。 D.子类型关系是不可逆的。
6.关于多继承二义性的描述中,错误的是( )
A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性。 B.解决二义性的常用方法是对成员名进行类名限定。
C.基类和派生类中同时出现的同名函数,也存在二义性问题。
D.一个派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该基类成员
进行访问时,也可能出现二义性。
7.设置虚基类的目的是( )
C++基类和派⽣类
整理⾃
通过继承机制,可以利⽤已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,⽽且还同时拥有旧的成员。我们称已存在的
⽤来派⽣新类的类为基类,⼜称为⽗类。由已存在的类派⽣出的新类称为派⽣类,⼜称为⼦类。
在++中,⼀个派⽣类可以从⼀个基类派⽣,也可以从多个基类派⽣。从⼀个基类派⽣的继承称为单继承;从多个基类派⽣的继承称为多继承。
派⽣类的定义格式
单继承的定义格式如下:
class :
{
};
其中,是新定义的⼀个类的名字,它是从中派⽣的,并且按指定的派⽣的。
常使⽤如下三种关键字给予表⽰:
public 表⽰公有基类;
private 表⽰私有基类;
protected 表⽰保护基类;
多继承的定义格式如下:
class :,,…
{
};
可见,多继承与单继承的区别从定义格式上看,主要是多继承的基类多于⼀个。
派⽣类的三种继承⽅式
公有继承(public)、私有继承(private)、保护继承(protected)是常⽤的三种继承⽅式。
1. 公有继承(public)
公有继承的特点是基类的公有成员和保护成员作为派⽣类的成员时,它们都保持原有的状态,⽽基类的私有成员仍然是私有的。
2. 私有继承(private)
私有继承的特点是基类的公有成员和保护成员都作为派⽣类的私有成员,并且不能被这个派⽣类的⼦类所访问。
3. 保护继承(protected)
保护继承的特点是基类的所有公有成员和保护成员都成为派⽣类的保护成员,并且只能被它的派⽣类成员函数或友元访问,基类的私有成员仍然是私有的。
下⾯列出三种不同的继承⽅式的基类特性和派⽣类特性。
继承⽅式基类特性派⽣类特性
公有继承publicpublic
protected
privateprotected
不可访问
私有继承publicprivate
protected
privateprivate
不可访问
保护继承publicprotected