继承是面向对象语言的重要特征之一继承是把已有类作为_第1页
继承是面向对象语言的重要特征之一继承是把已有类作为_第2页
继承是面向对象语言的重要特征之一继承是把已有类作为_第3页
继承是面向对象语言的重要特征之一继承是把已有类作为_第4页
继承是面向对象语言的重要特征之一继承是把已有类作为_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CHAPTER 10 Inheritance 继承继承IntroductionA key feature of an object-oriented language in inheritance. Inheritance is the ability to define new classes using existing classes as a basis. The new class inherits the attributes and behaviors of the classes on which it is based, and it can also have attrib

2、utes and behaviors that are specific to it.继承是面向对象语言的重要特征之一。继承是把已有类作为基类定义新的类。这个新的类继承了基类的属性和操作,而且还可以具有自己特定的属性和操作。Three relationships are commonly used in object-oriented design : is-a relationships Hierarchy relationship. It specifies that one abstraction is a specialization of another. has-a relatio

3、nships Contain relationship. Some object is part of another. uses-a relationships One object uses another object in some way. 10.1 OBJECT-ORIENTED DESIGN USING INHERITANCEis-a relationshipsBase class of B1 and B2Derived class of ABase class of C1, C2 and C3Derived class of ABase class of C3Derived c

4、lass of B1 and B2Multiple inheritanceDerived class of B1has-a relationshipsclass A FM ;class DM FM ;uses-a relationshipsclass A DM FMj ( ) ;class DM FM ;class DerivedClass : public BaseClass public :/ public section private :/ private section ;10.3.1 Declaring a derived class class DerivedClass : pu

5、blic BaseClass public :/ public section private :/ private section ;10.3.1 Declaring a derived class Derived class nameclass DerivedClass : public BaseClass public :/ public section private :/ private section ;10.3.1 Declaring a derived class Access specifier(usually public)class DerivedClass : publ

6、ic BaseClass public :/ public section private :/ private section ;10.3.1 Declaring a derived class Class name of base classDeclare vehicle class and derived class car:class public : void initialize (int in_wheels , float in_weight ) ; int get_wheels ( ) ; float get_weight ( ) ; float get_loading ( )

7、 ; private : int wheels ; float weight ; float loading ;;class : public public : void initialize ( int in_wheels , float in_weight , int people = 4 ) ; int passengers ( ) ; private : int passenger_load ;;Example 10.3.2 Implementing a derived class DClass : DClass ( Plist ) : BClass ( Plist ) , DMbrL

8、ist / Body of derived class constructor10.3.2 Implementing a derived class DClass : DClass ( Plist ) : BClass ( Plist ) , DMbrList / Body of derived class constructorDerived class name10.3.2 Implementing a derived class DClass : DClass ( Plist ) : BClass ( Plist ) , DMbrList / Body of derived class

9、constructorDerived class constructor parameter list10.3.2 Implementing a derived class DClass : DClass ( Plist ) : BClass ( Plist ) , DMbrList / Body of derived class constructorBase class name10.3.2 Implementing a derived class DClass : DClass ( Plist ) : BClass ( Plist ) , DMbrList / Body of deriv

10、ed class constructorBase class constructor parameter list10.3.2 Implementing a derived class DClass : DClass ( Plist ) : BClass ( Plist ) , DMbrList / Body of derived class constructorClass data member initialization list10.3.2 Implementing a derived class DClass : DClass ( Plist ) : BClass ( Plist

11、) , DMbrList / Body of derived class constructor/ Example13-1#include class Base public : Base ( ) cout nBase created.n ; ;class D_class : public Base public : D_class ( ) cout D_class created.n ; ;void main () D_class d1 ; Output Base created.D_class created./ Example13-2#include class parent_class

12、 int private1 , private2 ; public : parent_class ( ) private1 = p1; private2 = p2; int inc1 ( ) return +private1; int inc2 ( ) return +private2 ; void display ( ) cout private1= private1 , private2= private2 endl ; ;Base class constructor parameter listclass derived_class : private parent_class int

13、private3 ; parent_class private4 ; / Class data member public: derived_class ( int p1 , int p2 , int p3 , int p4 , int p5 ): parent_class ( p1 , p2 ) , private4 ( p3 , p4 ) private3 = p5 ; int inc1 ( ) return parent_class : inc1 ( ) ; int inc3 ( ) return +private3 ; void display ( ) parent_class : d

14、isplay ( ) ; private4 . display ( ) ; cout private3= private3 endl ; ;void main ( ) derived_class d1 ( 17 , 18 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ; d1 . display ( ) ;Five parameters of derived class constructorclass derived_class : private parent_class int private3 ; parent_class private4 ; / Class data

15、 member public: derived_class , int p3 , int p4 , int p5 ): , private4 ( p3 , p4 ) private3 = p5 ; int inc1 ( ) return parent_class : inc1 ( ) ; int inc3 ( ) return +private3 ; void display ( ) parent_class : display ( ) ; private4 . display ( ) ; cout private3= private3 endl ; ;void main ( ) derive

16、d_class d1 ( 17 , 18 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ; d1 . display ( ) ;For base classparent_class(p1,p2)Initialize private1 and private2class derived_class : private parent_class int private3 ; parent_class private4 ; / Class data member public: derived_class , int p5 ): , private3 = p5 ; int inc1

17、( ) return parent_class : inc1 ( ) ; int inc3 ( ) return +private3 ; void display ( ) parent_class : display ( ) ; private4 . display ( ) ; cout private3= private3 endl ; ;void main ( ) derived_class d1 ( 17 , 18 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ; d1 . display ( ) ;For class member private4 parent_cla

18、ss(p1,p2) : initialize private4.private1 and private4.private2class derived_class : private parent_class int private3 ; parent_class private4 ; / Class data member public: derived_class , ): , ; int inc1 ( ) return parent_class : inc1 ( ) ; int inc3 ( ) return +private3 ; void display ( ) parent_cla

19、ss : display ( ) ; private4 . parent_class : display ( ) ; cout private3= private3 endl ; ;void main ( ) derived_class d1 ( 17 , 18 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ; d1 . display ( ) ;For derived class Initialize data member private3class derived_class : private parent_class int private3 ; parent_cla

20、ss private4 ; / Class data member public: derived_class , ): , ; int inc1 ( ) return parent_class : inc1 ( ) ; int inc3 ( ) return +private3 ; void display ( ) parent_class : display ( ) ; private4 . parent_class : display ( ) ; cout private3= private3 endl ; ;void main ( ) derived_class d1 ( 17 , 1

21、8 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ; d1 . display ( ) ;Output private1 = 18 , private2 = 18 private1 = 1 , private2 = 2 private3 = -5 Data members and member functions can be cover in the derived class. The derived class member functions do not access to the private member of base class. 10.4 PROTECTE

22、D MEMBERS AND INHERITANCE 保护成员与继承 Exampleclass base public : int a , ; ;class derived : public base public : int , c ; ;void f ( ) derived d ; d . a = 1 ; d . = 2 ;/ use member b of base class d . = 3 ;/ use member b of derived class d . c = 4 ;Exampleclass X public : void get_ij ( ) ; void put_ij (

23、 ) ; ;class Y : public X public : int get_k ( ) ; void make_k ( ) ; private : int k ;void Y : make_k ( ) ; k = ;/ illegal ;Exampleclass X public : void get_ij ( ) ; void put_ij ( ) ; ;class Y : public X public : int get_k ( ) ; void make_k ( ) ; private : int k ;void Y : make_k ( ) ; k = ;/ illegal

24、; ;k = ;/ legal10.5 CONTROLLING INHERITANCE 控制继承 10.5.1 Public Inheritance 公有继承 class DerivedClass : public BaseClass public :/ public section private :/ private section ;The public members and protected members keep their character in derived class. / Example13-3#includeclass public : void get_ij(

25、) cout i j ; ; void put_ij( ) cout i j n ; ; protected : int i , j ;class : public X public : int get_k( ) return k ; ; void make_k( ) k = * ; ;/ use base class DM private : int k ;class : public Y public : void f( ) = 2 ; = 3; ; / use base class DM;void main ( ) ; ; . ; . ; var1.make_k( ) ; var2.f(

26、 ) ; . ;class Xclass Yclass Z10.5.2 Private inheritance 私有继承class DerivedClass : private BaseClass public :/ public section private :/ private section ;The public members and protected members of base class are private member in derived class. / Example13-4#includeclass public : void get_ij( ) cout

27、i j ; ; void put_ij( ) cout i j n ; ; protected : int i , j ;class : public X public : int get_k( ) return k ; ; void make_k( ) k = * ; ;/ use base class DM private : int k ;class : public Y public : void f( ) = 2 ; = 3; ; / use base class DM;void main ( ) ; ; . ; . ; var1.make_k( ) ; var2.f( ) ; .

28、;/ Example13-4#includeclass public : void get_ij( ) cout i j ; ; void put_ij( ) cout i j n ; ; protected : int i , j ;class : X public : int get_k( ) return k ; ; void make_k( ) k = * ; ;/ use base class DM private : int k ;class : public Y public : void f( ) = 2 ; = 3; ; / use base class DM;void ma

29、in ( ) ; ; . ; . ; var1.make_k( ) ; var2.f( ) ; . ;class Xclass Yclass ZprivatepublicOK i, j are private member in Y class/ Example13-4#includeclass public : void get_ij( ) cout i j ; ; void put_ij( ) cout i j n ; ; protected : int i , j ;class : X public : int get_k( ) return k ; ; void make_k( ) k

30、 = * ; ;/ use base class DM private : int k ;class : public Y public : void f( ) = 2 ; = 3; ; / use base class DM;void main ( ) ; ; . ; . ; var1.make_k( ) ; var2.f( ) ; . ;class Xclass Yclass ZprivatepublicCan not access private member of base class/ Example13-4#includeclass public : void get_ij( )

31、cout i j ; ; void put_ij( ) cout i j n ; ; protected : int i , j ;class : X public : int get_k( ) return k ; ; void make_k( ) k = * ; ;/ use base class DM private : int k ;class : public Y public : void f( ) = 2 ; = 3; ; / use base class DM;void main ( ) ; ; . ; . ; var1.make_k( ) ; var2.f( ) ; . ;c

32、lass Xclass Yclass Zprivatepublicmain() can not call private MF of any objects10.5.3 Protected inheritance 保护继承class DerivedClass : protected BaseClass public :/ public section private :/ private section ;The public members and protected members of base class are protected member in derived class. P

33、rotected inheritance is used rarely.Inheritance TypeBase Class Member AccessDerived Class Member Accesspublicpublicprotectedprivatepublicprotectedinaccessibleprotectedpublicprotectedprivateprotectedprotectedinaccessibleprivatepublicprotectedprivateprivateprivateinaccessible public : x class A protec

34、ted : y private : zSuch as : main()Common functionsclass B : public ADerived class C : private ADerivedA derived class can inherit from two or more base class.10.6 MULTIPLE INHERITANCE 多继承 class C : public A ,public Bclass Aclass B A derived class can inherit from two or more base class.10.6 MULTIPL

35、E INHERITANCE 多继承 The syntax for declaring a class derived using multiple inheritance is class DClass : public :/ public section private :/ private section ;/ Example13-4#includeclass A public : void setA ( int x ) a = x ; ; void showA( ) cout a endl ; ; private : int a ; ;class B public : void setB

36、 ( int x ) b = x ; ; void showB ( ) cout b endl ; ; private : int b ; ;class C : , public : void setC ( int x , int y , int z ) setA ( x ) ; setB ( y ) ; c = z ; ; void showC ( ) showA ( ) ; showB ( ) ; cout c endl ; ; private : int c ; ;void main ( ) C obj ; obj . setA ( 5 ) ; obj . showA ( ) ; obj

37、 . setC ( 6 , 7 , 9 ) ; obj . showC ( ) ; / error, private inheritance / errorclass Aclass Bclass C If a derived class be derived from multiple base classes, and these base have a common base class, then, when access members of this common base class may be open to different interpretations. 10.7 VI

38、RTUAL BASE CLASS Exampleclass B public : int b ; ;class B1 : public B private : int b1 ; ;class B2 : public B private : int b2 ; ;class C : public B1 , public B2 public : int f ( ) ; private : int d ; ;C c ;/ error/ error,where from?c . B1 : b/ ok,from B1c . B2 : b / ok ,from B2class C f () , d clas

39、s B1 b1 class B2 b2 class B b class B b / Example13-5#includeclass Bpublic: int b;class B1:public B public: int b1;class B2:public B public: int b2;class C:public B1, public B2 public: f(); private: int b1;void main() C c; c.B1:b=5; c.B2:b=10; coutc.B1:bendl; coutc.B2:b 5 path B2= 10class C f () , d

40、 class B1 b1 class B2 b2 class B b class B b bb1bb2dBBB1B2CStore of multiple derived class object C When create object C, constructor of B is called two times. Once for B1,Others for B2. A C object contains two sub-object of B. class C f () , d class B1 b1 class B2 b2 class B b class B b Exampleclas

41、s B public : int b ; ;class B1 : public B private : int b1 ; ;class B2 : public B private : int b2 ; ;class C : public B1 , public B2 public : int f ( ) ; private : int d ; ; If a derived class be derived from multiple base classes, and these base have a common base class, then, when access members

42、of this common base class may be open to different interpretations. 10.7 VIRTUAL BASE CLASS For produce only one sub-object in deriver class object, the base classes must be declared virtual inheritance the common base class. Key wordvirtual Exampleclass B public : int b ; ;class B1 : public B priva

43、te : int b1 ; ;class B2 : public B private : int b2 ; ;class C : public B1 , public B2 private : float d ; ;As:C cc ;/ OKclass C d class B1 b1class B2 b2 class B b cc . B1 : b and cc . B2 : b is same sub-object of class BStore of object C using virtual inheritance b1 b2dbclass C d class B1 b1class B

44、2 b2 class B b Exampleclass B public : int b ; ;class B1 : public B private : int b1 ; ;class B2 : public B private : int b2 ; ;class C : public B1 , public B2 private : float d ; ; If a derived class be derived from multiple base classes, and these base have a common base class, then, when access m

45、embers of this common base class may be open to different interpretations. 10.7 VIRTUAL BASE CLASS For produce only one sub-object in deriver class object, the base classes must be declared virtual inheritance the common base class. Using virtual inheritance, the constructor of common base class is

46、called only once. / Example13-6#include class A public : A ( ) cout class A endl ; ;class B : virtual public A public : B ( ) cout class B endl ; ;class C : virtual public A public : C ( ) cout class C endl ; ;class D : public B , public C public : D ( ) cout class D endl ; ;void main ( ) D dd ; Out

47、putclass Aclass Bclass Cclass D/ Example13-7#include class A public : A ( ) cout class A endl ; ;class B : /*virtual*/ public A public : B ( ) cout class B endl ; ;class C : /*virtual*/ public A public : C ( ) cout class C endl ; ;class D : public B , public C public : D ( ) cout class D endl ; ;voi

48、d main ( ) D dd ; Outputclass Aclass Bclass Aclass Cclass D Each object of a class has its own copy of all data members of the class. In certain cases only one copy of a variable should be share by all objects of a class. A static class variable is used for these and other reasons. The declaration o

49、f a static member begins with the keyword static. 10.8 STATIC CLASS MEMBERS 静态类成员 Static data members have class scope. Static data members must be initialized once (and only once) at file scope. A classs public static data members can be accessed through any object of that class. A classs private a

50、nd protected static data members must be accessed through public member functions of the class or through friends of the class.10.8.1 Static data members 静态数据成员 class object char ch ; static s ; . ; object A , B , C , D ; object B char ch ; object C char ch ; object D char ch ; object A char ch ;/ E

51、xample13-8#includeclass counter public : void setnum1 ( int i ) num1 = i ; void shownum1 ( ) cout num1 ; ;/ initial 0 can default void main ( ) counter a , b ; coutprivate static DM : n ; a . shownum1 ( ) ; b . shownum1 ( ) ; a . setnum1 ( 10 ) ; a . shownum1 ( ) ; b . shownum1 ( ) ; /error, can not

52、 access num1 cout“n public static DM :n endl;/ Example13-9 count the number of object# include class counter static int num ; public : counter ( ) cout + num t ; counter( ) cout num - t ; ;int counter : num = 0 ;void main ( ) counter a , b , c ; coutendl;Output1 2 33 2 1 Static member functions access static member only. Static member functions have no this pointer.10.8.2 Static member funct

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论