【笔记】C++ 继承
时间:2011-06-07 来源:我的学习、生活
1.1 什么是继承
在C++中,如果类C1通过继承已有类C而创建,则将C1称作派生类,将C称作基类,派生类会继承基类中定义的所有属性和方法。
1.2 派生类的定义
定义派生类的语法为:
1 Class 派生类名:继承方式 基类名
2 {
3 派生类成员说明;
4 };
其中,继承方式包括public、protected、private三种。
1.3 函数重定义
对于基类中的函数,可以再派生类中对其重新定义、实现新的功能。
区别函数重定义和函数重载:
函数重载:要求函数形参不同,在实际调用时根据传入的实参来决定执行哪个函数。
函数重定义:要求派生类中的函数原型与基类中的函数原型一样,在实际调用时根据对象类型来决定调用基类中定义的函数还是派生类中重定义的函数。
1.4 派生类的继承方式
继承方式包括public、protected、private三种,总结如下:
继承方式 访问方式 |
public |
private |
protected |
public |
public |
不可访问 |
protected |
private |
private |
不可访问 |
private |
protected |
protected |
不可访问 |
protected |
1.5 派生类的构造函数与析构函数
派生类构造函数的作用主要是对派生类中新添加的数据成员做初始化工作。同样,派生类析构函数的作用主要是清除派生类中新添加的数据成员,释放它们所占据的系统资源。
1.5.1构造函数和析构函数的定义
派生类中构造函数的定义形式有如下两种:
(1)形式1
1 派生类名(形参列表):基类名(实参列表)
2 {
3 //派生类中数据成员的初始化
4 }
(2)形式2
1 派生类名(形参列表)
2 {
3 //派生类中数据成员的初始化
4 }
派生类中析构函数的定义形式与基类完全相同,如下:
1 ~派生类名()
2 {
3 //释放派生类中数据成员所占据的系统资源
4 }
1.5.2 构造函数和析构函数的调用顺序
当创建派生类对象时,先调用基类的构造函数,再调用派生类的构造函数;析构函数调用顺序总是与构造函数调用顺序相反。
1.6 类型兼容(这个有点绕,需要好好理解下)
类型兼容是指在基类对象可以出现的任何地方,都可以用共有派生类的对象来代替。类型兼容所指的是如下三种情况:
(1)派生类对象可以赋值给基类对象;
(2)派生类对象可以初始化基类的引用;
(3)基类指针可以指向派生类对象。
注意:用派生类对象替代基类对象进行赋值操作后,通过基类对象、基类对象引用和基类指针只能访问基类成员。
虽然用派生类代替了基类之后,就可以把派生类对象当做基类对象使用,但是只能访问基类成员。
1.7 多重继承
1.7.1 多重继承的语法
在一个多重继承关系中,定义派生类的语法为:
1 Class 派生类名:继承方式 基类名1,继承方式 基类名2,...,继承方式 基类名n
2 {
3 派生类成员声明;
4 };
其中,基类名的顺序决定了构造函数的顺序。
1.7.2 二义性问题和虚基类
二义性问题:多个基类如果存在相同的成员,就会带来二义性问题。派生类对象不知道应该访问哪个基类的成员。
解决二义性问题的步骤为:
(1)为多重继承关系中具有相同成员的两个基类C1和C2定义一个共同的基类C,基类C中包括C1和C2中相同的成员,同时将这些相同的成员从C1和C2中删除。
(2)C1和C2都作为C类的派生类,在C1和C、C2和C这两个继承关系中将C声明为虚拟继承方式,此时C类被称为虚基类。
虚拟继承的语法为:
1 class 派生类名:virtual 继承方式 虚基类名
2 {
3 ...
4 }
好了,今天的学习就到这里了。
...
参考:
面向对象程序设计----C++高级语言 主编 赵宏