继承性和派生类刘丹

上传人:ji****72 文档编号:50951700 上传时间:2018-08-11 格式:PPT 页数:115 大小:2.01MB
返回 下载 相关 举报
继承性和派生类刘丹_第1页
第1页 / 共115页
继承性和派生类刘丹_第2页
第2页 / 共115页
继承性和派生类刘丹_第3页
第3页 / 共115页
继承性和派生类刘丹_第4页
第4页 / 共115页
继承性和派生类刘丹_第5页
第5页 / 共115页
点击查看更多>>
资源描述

《继承性和派生类刘丹》由会员分享,可在线阅读,更多相关《继承性和派生类刘丹(115页珍藏版)》请在金锄头文库上搜索。

1、第七章第七章 继承性和派生类继承性和派生类基类和派生类基类和派生类单继承单继承多继承多继承虚基类虚基类应用实例应用实例17.1 7.1 基类和派生类基类和派生类派生类的定义格式派生类的定义格式派生类的三种继承方式派生类的三种继承方式基类成员在派生类中的访问权限基类成员在派生类中的访问权限成员访问权限控制成员访问权限控制2生物类动物类植物类微生物类脊椎动物类其它动物类哺乳动物类其它脊椎动物类灵长动物类其它动物类人 类狒狒类其它灵长动物类 3通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。 基类(父类):已存 在的用来派生新

2、类 的类; 派生类(子类):由 已存在的类派生出 的新类;4 一个派生类可以从一个基类派生,也可以从多个基类 派生。从一个基类派生的继承称为单继承;从多个基类派 生的继承称为多继承。兼职技术人员销售经理管理人员销售人员雇员5class 派生类名 :继承方式 基类名 派生类新定义成员 ; public:公有继承 private:私有继承 protected:保护继承规定基类成员 在派生类中的 访问权限7.1.17.1.1派生类的定义格式派生类的定义格式单继承的定义格式为:单继承的定义格式为:class A /类的成员 ; class B:public A /类B新添加的成员 ;基类派生类AB6c

3、lass 派生类名 :继承方式1 基类名1,继承方式2 基类名2, 派生类新定义成员;多继承的定义格式为:多继承的定义格式为:class A 类的成员; class B 类的成员; class C:public A,public B 类C新添加的成员 ;基类派生类ACB7私有成员公有成员保护成员私有成员公有成员保护成员基类部分新定义部分派生类 派生类成员派生类的构成8类的成员可以有public、protected和private3种访问权 限。7.1.2 7.1.2 派生类的三种继承方式派生类的三种继承方式类的继承方式也有public、protected和private3种。不同的继承方式会导

4、致基类成员在派生类中的访问权限不 同。这里所说的访问主要来自两个方面: 派生类中的新增成员对从基类继承来的成员的访问。在派生类的外部通过派生类的对象对从基类继承来的 成员的访问。9 其特点是:基类的公有成员和保护成员作为派生类 的成员时,都保持原有状态,而私有成员不被继承。1 1、公有继承、公有继承1011class student private: int age;protected: char sex;public: int Getage( ) return age; ;class graduatestudent: public student private: int stunum; p

5、ublic: void Getnum( );void graduatestudent:Getnum( ) /cout class A public: int x; ; class B:public A private: int y; protected: int z; public: int m; void setvalue(int a,int b,int c,int d) x=a;y=b;z=c;m=d; void display() cout class A int i; public: void seta(int x) i=x; void dispa() cout class A pub

6、lic:void f(int i) cout #include class A public: A(const char *nm) strcpy(name,nm); private: char name80; ;class B:public A public: B(const char *nm):A(nm) void PrintName() const; ; void B:PrintName() const cout class A int no; int tag; public: void seta(int n,int t) no=n; tag=t; void dispa() cout cl

7、ass A public: A() cout class A public: int n; void show()cout class A public:A() cout class A public: A() cout class A public: A( ) coutclass M public:M()m1=m2=0;M(int i,int j)m1=i;m2=j;void print() coutprint(); fun(bb); 输 出9190调用A.Geta()*10;bb=aa;53#include class animal public: void breath() cout c

8、lass A int i; public: void set(int x) i=x; void disp() coutshow(); A B a57class A public:A(int x=5)n=+x;void show()cout class one public:void output( )cout class base int n1;public:base(int m1) n1=m1;void show() coutvoid main () C c ;c . B1 : b = 5 ; c . B2 : b = 10 ;cout “ “ l说明:l关键字virtual与关键字publ

9、ic或private的相 对位置无关,但必须位于虚基类名之前,且virtual 只对紧随其后的基类名起作用;例如: class D:virtual public A,private B,virutal public C 其中:类A和类C是虚基类,而类B是非虚基类;7.4.1 虚基类的引入和说明85例: class A public:void f(); protected:int a; ; class B:virtual public A protected:int b; ; class C:virtual public A protected:int c; ; class D:public B

10、,public C public:int g(); private:int d; ;ABDCABDCAab1ab2cab1b2cc1.a; c1.A:a; c1.a; c1.A:a; c1.B1:a;c1.B2:a; c1.B1:a;c1.B2:a; /为同一个值,正确 类C对象中只存在一个类A的子对象,消除了二义性。86虚基类与非虚基类的存储结构虚基类非虚基类BCADBCDAA87例如:class B public : int b ; ;class B1 : virtual public B private : int b1 ; ;class B2 : virtual public B pr

11、ivate : int b2 ; ;class C : public B1 , public B2 private : float d ; ; class C d class B1 b1class B2 b2 class B b 由于类 C 的对象中只有一个 B 类子对象,名字 b 被约束到该子对象上,所以,当以不同路径使用名字 b 访问 B 类的子对象时,所访问的都是那个唯一的基类子对象。即cc . B1 : b 和 cc . B2 : b 引用是同一个基类 B 的子对象7.5.2 虚基类C cc ; cc . b/ ok887.5.2 虚基类例如:class B public : int

12、b ; ;class B1 : virtual public B private : int b1 ; ;class B2 : virtual public B private : int b2 ; ;class C : public B1 , public B2 private : float d ; ;class C d class B1 b1class B2 b2 class B b 带有虚基类的派生类 C 的对象的存储结构示意c.b1c.b2c.dc.bB BB1B1B2B2C C89#include class A public :A ( ) cout class A public

13、:A ( ) cout class A public:int x;A(int a=0) x=a;void display() cout class A public: A() cout template class A T a; public: A() A(T x) a=x; void dispa() cout class B:public A T b; public: B(T x,T y):A(x) b=y; void dispb() dispa(); cout b(1,2); b.dispb(); 104从非模板类派生类模板l可以从一个普通类派生出类模板105#include #inclu

14、de const int max=100; class A char strmax; public: A(char s) strcpy(str,s); void disp() cout class B:public A T deg; public: B(char s,T d):A(s) deg=d; void disp() A:disp();cout a(“小花的成绩是“,85); B b(“小花的成绩是“,B); a.disp(); b.disp(); 106从类模板派生非模板类l可以从类模板派生出非模板类,在派生时,作为非 模板类的基类,必须是类模板实例化后的模板类, 并且在定义派生类是不

15、需要使用template语句。107#include #include const int max=100; template class A T deg; public: A(T d) deg=d; void disp() cout char strmax; public: B(char s,int d):A(d) strcpy(str,s); void disp() cout:disp(); ; void main() B b(“小花的成绩是“,85); b.disp(); 1087.5 7.5 应用实例应用实例日期和时间日期和时间109日期和时间日期和时间建立三个类,一个为日期类建立三个类,一个为日期类DateDate,一个为时间类一个为时间类 TimeTime,另一个为上面两个类的派生类另一个为上面两个类的派生类DateTi

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号