《C++语言程序设计(清华大学郑莉)07.ppt》由会员分享,可在线阅读,更多相关《C++语言程序设计(清华大学郑莉)07.ppt(73页珍藏版)》请在优知文库上搜索。
1、1第七章第七章 继承与派生继承与派生C+语言程序设计C+语言程序设计2本章主要内容本章主要内容l类的继承类的继承l类成员的访问控制类成员的访问控制l单继承与多继承单继承与多继承l派生类的构造、析构函数派生类的构造、析构函数l类成员的标识与访问类成员的标识与访问l深度探索深度探索C+语言程序设计3类的继承与派生类的继承与派生l保持已有类的特性而构造新类的过程保持已有类的特性而构造新类的过程称为继承。称为继承。l在已有类的基础上新增自己的特性而在已有类的基础上新增自己的特性而产生新类的过程称为派生。产生新类的过程称为派生。l被继承的已有类称为基类(或父类)。被继承的已有类称为基类(或父类)。l派生
2、出的新类称为派生类。派生出的新类称为派生类。C+语言程序设计4继承与派生问题举例继承与派生问题举例工具车轿车面包车小汽车卡车旅行车汽车汽车交通工具交通工具类的继承与派生C+语言程序设计5继承与派生问题举例继承与派生问题举例猴子猴子狮子虎猎豹猫猫鸟鸟动物动物类的继承与派生猫科猫科C+语言程序设计6继承与派生问题举例继承与派生问题举例圆圆矩形矩形几何形状几何形状类的继承与派生C+语言程序设计7继承与派生问题举例继承与派生问题举例兼职技术人员销售经理管理人员销售人员雇员类的继承与派生C+语言程序设计8继承与派生的目的继承与派生的目的l继承的目的:实现代码重用。继承的目的:实现代码重用。l派生的目的:
3、当新的问题出现,原有派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,程序无法解决(或不能完全解决)时,需要对原有程序进行改造。需要对原有程序进行改造。类的继承与派生C+语言程序设计9派生类的声明派生类的声明class 派生类名:派生类名:继承方式继承方式 基类名基类名 成员声明;成员声明;类的继承与派生C+语言程序设计10继承方式继承方式l三种继承方式三种继承方式 公有继承 私有继承 保护继承l不同继承方式的影响主要体现在:不同继承方式的影响主要体现在:派生类成员成员对基类成员的访问权限通过派生类对象对象对基类成员的访问权限类成员的访问控制C+语言程序设计11公有继承公有继承
4、(public)l基类的基类的public和和protected成员的访问成员的访问属性在派生类中属性在派生类中保持不变保持不变,但,但基类的基类的private成员成员不可不可直接直接访问访问。l派生类中的派生类中的成员函数成员函数可以直接访问基类可以直接访问基类中的中的public和和protected成员,但不能成员,但不能直接访问基类的直接访问基类的private成员。成员。l通过派生类的通过派生类的对象对象只能访问基类的只能访问基类的public成员。成员。类成员的访问控制C+语言程序设计12例例7-1 公有继承举例公有继承举例/基类基类PointPoint类的定义类的定义class
5、 Point class Point public:public:/公有函数成员公有函数成员void void initPointinitPoint(float x = 0, float y = 0) (float x = 0, float y = 0) this-x = x; this-y = y; this-x = x; this-y = y;void move(float void move(float offXoffX, float , float offYoffY) ) x += x += offXoffX; y += ; y += offYoffY; ; float float g
6、etXgetX() const return x; () const return x; float float getYgetY() const return y; () const return y; private:private:/私有数据成员私有数据成员float x, y;float x, y;类成员的访问控制class Rectangle: public Point class Rectangle: public Point /派生类定义部分派生类定义部分public:public:/新增公有函数成员新增公有函数成员void void initRectangleinitRecta
7、ngle(float x, float y, float w, (float x, float y, float w, float h) float h) initPointinitPoint(x, y); (x, y); /调用基类公有成员函数调用基类公有成员函数this-w = w;this-w = w;this-h = h;this-h = h; float float getHgetH() const return h; () const return h; float float getWgetW() const return w; () const return w; privat
8、e:private:/新增私有数据成员新增私有数据成员float w, h;float w, h;13#include #include #include #include using namespace std;using namespace std;intint main() main() Rectangle Rectangle rectrect; ;/定义定义RectangleRectangle类的对象类的对象/设置矩形的数据设置矩形的数据rect.rect.initRectangleinitRectangle(2, 3, 20, 10);(2, 3, 20, 10);rect.rect
9、.movemove(3,2);(3,2);/移动矩形位置移动矩形位置coutcout The data of The data of rectrect( (x,y,w,hx,y,w,h): ): endlendl; ;/输出矩形的特征参数输出矩形的特征参数coutcout rect.getXrect.getX() , () , rect.getYrect.getY() () , , rect.getWrect.getW() , () , rect.getHrect.getH() () w = w;this-w = w;this-h = h;this-h = h; void move(float
10、 void move(float offXoffX, float , float offYoffY) ) Point:move(Point:move(offXoffX, , offYoffY);); float float getXgetX() const () const return Point:return Point:getXgetX(); (); float float getYgetY() const () const return Point:return Point:getYgetY(); (); float float getHgetH() const return h; (
11、) const return h; float float getWgetW() const return w; () const return w; private:private:/新增私有数据成员新增私有数据成员float w, h;float w, h;类成员的访问控制#include #include #include #include using namespace std;using namespace std;intint main() main() Rectangle Rectangle rectrect; ; /定义定义RectangleRectangle类的对象类的对象r
12、ect.rect.initRectangleinitRectangle(2, 3, 20, 10);(2, 3, 20, 10); /设置矩形的数据设置矩形的数据rect.rect.movemove(4,2);(4,2); /移动矩形位置移动矩形位置coutcout The data of The data of rectrect( (x,y,w,hx,y,w,h): ): endlendl; ;coutcout rect.rect.getXgetX() , () , /输出矩形的特征参数输出矩形的特征参数 rect.rect.getYgetY() , () , rect.rect.getWg
13、etW() , () , rect.rect.getHgetH() () endlendl; ;return 0;return 0; 17The data of rect(x,y,w,h):6, 5, 20, 10Press any key to continueC+语言程序设计18保护继承保护继承(protected)l基类的基类的public和和protected成员都以成员都以protected身份出现身份出现在派生类中,但在派生类中,但基类的基类的private成员成员不可直接访问不可直接访问。l派生类中的派生类中的成员函数成员函数可以直接访问基可以直接访问基类中的类中的public和
14、和protected成员,但成员,但不能直接访问基类的不能直接访问基类的private成员。成员。l通过派生类的通过派生类的对象对象不能直接访问基类不能直接访问基类中的任何成员中的任何成员类成员的访问控制C+语言程序设计19protected 成员的特点与作用成员的特点与作用l对建立其所在类对象的模块来说,它对建立其所在类对象的模块来说,它与与 private 成员的性质相同。成员的性质相同。l对于其派生类来说,它与对于其派生类来说,它与 public 成成员的性质相同。员的性质相同。l既实现了数据隐藏,又方便继承,实既实现了数据隐藏,又方便继承,实现代码重用。现代码重用。类成员的访问控制C+
15、语言程序设计20例例7-3 protected 成员举例成员举例class A class A protected:protected:intint x; x;intint main() main() A A a a; ;a.xa.x = 5; / = 5; /错误错误 类成员的访问控制class A class A protected:protected:intint x; x;class B: public Aclass B: public Apublic:public:void function();void function();void B:function() void B:fun
16、ction() x = 5; /x = 5; /正确正确 21void main() B b; b.x=5; C+语言程序设计22类型兼容规则类型兼容规则l一个公有派生类的对象在使用上可以一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具被当作基类的对象,反之则禁止。具体表现在:体表现在: 派生类的对象可以隐含转换为基类对象。 派生类的对象可以初始化基类的引用。 派生类的指针可以隐含转换为基类的指针。l通过基类对象名、指针只能使用从基通过基类对象名、指针只能使用从基类继承的成员类继承的成员类型兼容C+语言程序设计23例例7-4 类型兼容规则举例类型兼容规则举例#include #include using namespace std;using namespace std;class Base1 /class Base1 /基类基类Base1Base1定义定义public:public:void display() void display() constconst coutcout Base1:display() Base1:display() endlendl; ;