钱能C++程序设计教程优秀PPT
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
12
5. 继承与组合 ( Inheritance & Composition )
研究生对象
继承部分 派生部分
Student对象
Advisor对象 其他数据成员
组合式 包含
继承式 包含
组合:类中含有对象成员,称为组合 式包含
继承:子类继承了父类,称为子类对 象对父类对象的继承式包含
f.fp();
void ed(){a++;} // error };
}
// ok // ok // error
// ok // error
1
6
3.构造子类对象 ( Constructing Objects of SubClass )
默认构造:
如果子类没有构造函数,则调用 默认构造函数,默认构造函数转 而先调用默认父类构造函数,完 成父类对象部分的构造. 如果父类的上面还有父类,则依 次递归.
C++程序设计教程(第二版)
第十章 继承 Chapter 10 Inheritance
清华大学出版社 钱 能
1
1
第十章内容
1. 继承结构 ( Inheritance Structure ) 2. 访问父类成员 ( Access Father’s Member ) 3. 派生类的构造 ( Constructing Derived Classes ) 4. 继承方式 ( Inheritance Mode ) 5. 继承与组合 ( Inheritance & Composition ) 6. 多继承概念 ( Multi-Inheritance Concept ) 7. 多继承技术 ( Multi-Inheritance Technology )
捆绑子类对象可以访问父类成员函数和自
身成员函数;
捆绑基类对象只能访问基类成员函数,不
能访问子类成员函数,这是自然的:
Student ds(“Jenny"); GraduateStudent gs(“Smith”); ds.addCourse(3, 2.5); ds.display(); gs.addCourse(3, 3.0); gs.display(); gs.getQualifier(); ds.getQualifier(); // error
捆绑子类对象访问成员函数,则首先匹配子类, 然后父类,再父类的父类,依此类推.
1
9
拷贝构造:
子类若没有定义拷贝构造函数,则子 类对象在拷贝创建时先调用父类的拷 贝构造函数,再完成自己的位对位拷 贝. 父类若没有定义拷贝构造函数,则子 类对象在拷贝创建中调用父类默认的 拷贝构造函数.
赋值操作符原理相似
1
5
子类也是基类的用户,其成员函数不能访问基类的私有成员. 但子类可以区别于外来用户,让基类protected成员允许子类对
象访问而不许外来对象访问. 例如,对于基类:
class Father{ int a;
protected: void fp(){ cout<<a; }
public: void print(){ cout<<a; }
子类再继承下去.
1
11
继承体系中,子类可以在祖先
类成员可见的范围中调整其 访问控制属性.
class A{ int a1;
public: int a2;
}; class B : private A{ public:
using A::a2; // a2从私有转为公有 using A::a1; // 错: a1不可见 }; int main(){ B d; d.a2 = 1; // ok }
};
外来用户:
子类用户:
void fn(){
class Son : public Father{ Son d;
int b;
d.print();
public:
d.disp();
void disp(){
d.fp();
fp();
// ok
Father f;
print(); // ok
f.print();
}
1
7
自定义构造: 为了规定父类构造函数的调用方式而不是默认 调用,需要自定义子类构造函数,并且,在构 造函数定义体的初始化列表中描述父类构造函 数的调用形式. 描述形式与对象成员构造的描述一致.
GraduateStudent ( const string& pN, Advisor& adv ) : Student(pN), advisor(adv), qualifierGrade(0)
1
3
派生类对象结构
基类对象
a b
子类对象
a
b
基类部分
c
子类添加部分
子类对象空间总是不小于基类对象
对于下面的继承关系:
class Father{ int a,b;
public: // 成员函数
};
class Son:public Father{ int c;
public: // 成员函数
};
1
4
2. 访问父类成员 ( Access Father’s Member )
1
10
4. 继承方式 ( Inheritance Mode )
Leabharlann Baidu
继承可以公有继承,保护继承和私 有继承.
公有继承是普通继承,基类可以为 大多数应用服务.也可以重复继 承
保护继承是“单传”继承,只继承 给自己的后代,应用是以子孙的 公有成员函数来对外展开服务 的.
私有继承是“绝版”继承,该基类
只继承直接的子类,而不考虑让
1
2
1. 继承结构 ( Inheritance Structure )
宇宙万事万物都是分类分层的,解决 问题可以从事物之间的上下关系中着 手.这是继承引入程序设计的前提.
例如:已知鸟的属性,鸭子是什么的 描述便可以在鸟的基础上进行:
除了是鸟之外,还会一种区别于 其他鸟的特殊的嘎嘎叫.
因为鸭子不会飞,于是就在继承 鸟的属性中去掉会飞的属性.
{}
1
8
覆盖(overlap):
子类定义了与祖先类(父类,或者父类的父类...) 名字相同的成员.
class Student{ public:
void display(); // ... }; class GraStudent:public Student{ public: void display(); //overlap // ... }; void fn(){ GraStudent gs; gs.display(); //call GraStudent::display() }