七章继承--2.ppt

上传人:本田雅阁 文档编号:3183310 上传时间:2019-07-22 格式:PPT 页数:82 大小:730.52KB
返回 下载 相关 举报
七章继承--2.ppt_第1页
第1页 / 共82页
七章继承--2.ppt_第2页
第2页 / 共82页
七章继承--2.ppt_第3页
第3页 / 共82页
七章继承--2.ppt_第4页
第4页 / 共82页
七章继承--2.ppt_第5页
第5页 / 共82页
点击查看更多>>
资源描述

《七章继承--2.ppt》由会员分享,可在线阅读,更多相关《七章继承--2.ppt(82页珍藏版)》请在三一文库上搜索。

1、7.2.1 访问控制,3.保护继承,派生类定义了与基类同名的成员,在派生类中访问同名成员 时屏蔽了基类的同名成员 在派生类中使用基类的同名成员,显式地使用类名限定符: 类名 : 成员,7.2.2 重名成员,7.2.2 重名成员,例: class base public : int a , b ; ; class derived : public base public : int b , c ; ; void f () derived d ; d . a = 1 ; d . base : b = 2 ; d . b = 3 ; d . c = 4 ; ;,7.2.2 重名成员,1.重名数据成员

2、,base a b,derived a b b c,例: class base public : int a , b ; ; class derived : public base public : int b , c ; ; void f () derived d ; d . a = 1 ; d . base : b = 2 ; d . b = 3 ; d . c = 4 ; ;,7.2.2 重名成员,1.重名数据成员,base a b,derived a b b c,例: class base public : int a , b ; ; class derived : public ba

3、se public : int b , c ; ; void f () derived d ; d . a = 1 ; d . base : b = 2 ; d . b = 3 ; d . c = 4 ; ;,7.2.2 重名成员,base a b,derived a b b c,访问从base 类继承 的数据成员a,1.重名数据成员,例: class base public : int a , b ; ; class derived : public base public : int b , c ; ; void f () derived d ; d . a = 1 ; d . base

4、: b = 2 ; d . b = 3 ; d . c = 4 ; ;,7.2.2 重名成员,访问从base 类继承的 b,base a b,derived a b b c,1.重名数据成员,例: class base public : int a , b ; ; class derived : public base public : int b , c ; ; void f () derived d ; d . a = 1 ; d . base : b = 2 ; d . b = 3 ; d . c = 4 ; ;,7.2.2 重名成员,访问derived 类定义 的数据成员b,base

5、a b,derived a b b c,1.重名数据成员,例: class base public : int a , b ; ; class derived : public base public : int b , c ; ; void f () derived d ; d . a = 1 ; d . base : b = 2 ; d . b = 3 ; d . c = 4 ; ;,7.2.2 重名成员,访问derived 类 定义的数据成员c,base a b,derived a b b c,1.重名数据成员,例: class base public : int a , b ; ; c

6、lass derived : public base public : int b , c ; ; void f () derived d ; d . a = 1 ; d . base : b = 2 ; d . b = 3 ; d . c = 4 ; ;,7.2.2 重名成员,base a b,derived a b b c,基类成员的作用域延伸到所有派生类 派生类的重名成员屏蔽基类的同名成员,1.重名数据成员,/例7-4 #include class A public: int a1, a2 ; A( int i1=0, int i2=0 ) a1 = i1; a2 = i2; void

7、print() cout “a1=“ a1 t “a2=“ a2 endl ; ; class B : public A public: int b1, b2 ; B( int j1=1, int j2=1 ) b1 = j1; b2 = j2; void print() /定义同名函数 cout “b1=“ b1 t “b2=“ b2 endl ; void printAB() A:print() ; /派生类对象调用基类版本同名成员函数 print() ; /派生类对象调用自身的成员函数 ; void main() B b ; b.A:print(); b.printAB(); ,7.2.

8、2 重名成员,2.重名成员函数,void print() cout “a1=“ a1 t “a2=“ a2 endl ; ,void print() /定义同名函数 cout “b1=“ b1 t “b2=“ b2 endl ; ,/例7-4 #include class A public: int a1, a2 ; A( int i1=0, int i2=0 ) a1 = i1; a2 = i2; void print() cout “a1=“ a1 t “a2=“ a2 endl ; ; class B : public A public: int b1, b2 ; B( int j1=1

9、, int j2=1 ) b1 = j1; b2 = j2; void print() /定义同名函数 cout “b1=“ b1 t “b2=“ b2 endl ; void printAB() A:print() ; /派生类对象调用基类版本同名成员函数 print() ; /派生类对象调用自身的成员函数 ; void main() B b ; b.A:print(); b.printAB(); ,7.2.2 重名成员,2.重名成员函数,void print() cout “a1=“ a1 t “a2=“ a2 endl ; ,void print() /定义同名函数 cout “b1=“

10、 b1 t “b2=“ b2 endl ; ,派生类屏蔽基类同名成员函数 调用自身的成员函数,/例7-4 #include class A public: int a1, a2 ; A( int i1=0, int i2=0 ) a1 = i1; a2 = i2; void print() cout “a1=“ a1 t “a2=“ a2 endl ; ; class B : public A public: int b1, b2 ; B( int j1=1, int j2=1 ) b1 = j1; b2 = j2; void print() /定义同名函数 cout “b1=“ b1 t “

11、b2=“ b2 endl ; void printAB() A:print() ; /派生类对象调用基类版本同名成员函数 print() ; /派生类对象调用自身的成员函数 ; void main() B b ; b.A:print(); b.printAB(); ,7.2.2 重名成员,2.重名成员函数,void print() cout “a1=“ a1 t “a2=“ a2 endl ; ,void print() /定义同名函数 cout “b1=“ b1 t “b2=“ b2 endl ; ,派生类对象调用从基类继承的同名成员函数,/例7-4 #include class A pub

12、lic: int a1, a2 ; A( int i1=0, int i2=0 ) a1 = i1; a2 = i2; void print() cout “a1=“ a1 t “a2=“ a2 endl ; ; class B : public A public: int b1, b2 ; B( int j1=1, int j2=1 ) b1 = j1; b2 = j2; void print() /定义同名函数 cout “b1=“ b1 t “b2=“ b2 endl ; void printAB() A:print() ; /派生类对象调用基类版本同名成员函数 print() ; /派

13、生类对象调用自身的成员函数 ; void main() B b ; b.A:print(); b.printAB(); ,7.2.2 重名成员,2.重名成员函数,void print() cout “a1=“ a1 t “a2=“ a2 endl ; ,void print() /定义同名函数 cout “b1=“ b1 t “b2=“ b2 endl ; ,基类this指针 指向派生类对象,/例7-4 #include class A public: int a1, a2 ; A( int i1=0, int i2=0 ) a1 = i1; a2 = i2; void print() cou

14、t “a1=“ a1 t “a2=“ a2 endl ; ; class B : public A public: int b1, b2 ; B( int j1=1, int j2=1 ) b1 = j1; b2 = j2; void print() /定义同名函数 cout “b1=“ b1 t “b2=“ b2 endl ; void printAB() A:print() ; /派生类对象调用基类版本同名成员函数 print() ; /派生类对象调用自身的成员函数 ; void main() B b ; b.A:print(); b.printAB(); ,7.2.2 重名成员,2.重名

15、成员函数,/例7-4 #include class A public: int a1, a2 ; A( int i1=0, int i2=0 ) a1 = i1; a2 = i2; void print() cout “a1=“ a1 t “a2=“ a2 endl ; ; class B : public A public: int b1, b2 ; B( int j1=1, int j2=1 ) b1 = j1; b2 = j2; void print() /定义同名函数 cout “b1=“ b1 t “b2=“ b2 endl ; void printAB() A:print() ;

16、/派生类对象调用基类版本同名成员函数 print() ; /派生类对象调用自身的成员函数 ; void main() B b ; b.A:print(); b.printAB(); ,7.2.2 重名成员,2.重名成员函数,/例7-4 #include class A public: int a1, a2 ; A( int i1=0, int i2=0 ) a1 = i1; a2 = i2; void print() cout “a1=“ a1 t “a2=“ a2 endl ; ; class B : public A public: int b1, b2 ; B( int j1=1, in

17、t j2=1 ) b1 = j1; b2 = j2; void print() /定义同名函数 cout “b1=“ b1 t “b2=“ b2 endl ; void printAB() A:print() ; /派生类对象调用基类版本同名成员函数 print() ; /派生类对象调用自身的成员函数 ; void main() B b ; b.A:print(); b.printAB(); ,7.2.2 重名成员,2.重名成员函数,/例7-4 #include class A public: int a1, a2 ; A( int i1=0, int i2=0 ) a1 = i1; a2 =

18、 i2; void print() cout “a1=“ a1 t “a2=“ a2 endl ; ; class B : public A public: int b1, b2 ; B( int j1=1, int j2=1 ) b1 = j1; b2 = j2; void print() /定义同名函数 cout “b1=“ b1 t “b2=“ b2 endl ; void printAB() A:print() ; /派生类对象调用基类版本同名成员函数 print() ; /派生类对象调用自身的成员函数 ; void main() B b ; b.A:print(); b.printA

19、B(); ,7.2.2 重名成员,2.重名成员函数,通过继承,类B具有两个同名成员函数 void A:print(); void B:print();,/ void print( A * this );,/ void print( B * this );,/例7-4 #include class A public: int a1, a2 ; A( int i1=0, int i2=0 ) a1 = i1; a2 = i2; void print() cout “a1=“ a1 t “a2=“ a2 endl ; ; class B : public A public: int b1, b2 ;

20、 B( int j1=1, int j2=1 ) b1 = j1; b2 = j2; void print() /定义同名函数 cout “b1=“ b1 t “b2=“ b2 endl ; void printAB() A:print() ; /派生类对象调用基类版本同名成员函数 print() ; /派生类对象调用自身的成员函数 ; void main() B b ; b.A:print(); b.printAB(); ,7.2.2 重名成员,2.重名成员函数,通过继承,类B具有两个同名成员函数 void A:print(); void B:print(); 派生类也是基类,基类指针可以指

21、向 派生类对象 派生类中定义与基类同名的成员函数, 称为重载成员函数,/ void print( A * this );,/ void print( B * this );,7.2.3 派生类中的静态成员,基类定义的静态成员,将被所有派生类共享 根据静态成员自身的访问特性和派生类的继承方式,在类层次 体系中具有不同的访问性质 派生类中访问静态成员,用以下形式显式说明: 类名 : 成员 或通过对象访问 对象名 . 成员,7.2.3 派生类中的静态成员,#include class B public: static void Add() i+ ; static int i; void out()

22、cout“static i=“iendl; ; int B:i=0; class D : private B public: void f(); i=5; Add(); B:i+; B:Add(); ;,/例7-5 在派生类中访问静态成员,void main() B x; D y; x.Add(); x.out(); y.f(); cout“static i=“B:iendl; cout“static i=“x.iendl; /cout“static i=“y.iendl; ,class B,class D : private B,#include class B public: static

23、 void Add() i+ ; static int i; void out() cout“static i=“iendl; ; int B:i=0; class D : private B public: void f(); i=5; Add(); B:i+; B:Add(); ;,/例7-5 在派生类中访问静态成员,void main() B x; D y; x.Add(); x.out(); y.f(); cout“static i=“B:iendl; cout“static i=“x.iendl; /cout“static i=“y.iendl; ,static void Add()

24、 i+ ; ,静态成员函数,#include class B public: static void Add() i+ ; static int i; void out() cout“static i=“iendl; ; int B:i=0; class D : private B public: void f(); i=5; Add(); B:i+; B:Add(); ;,/例7-5 在派生类中访问静态成员,void main() B x; D y; x.Add(); x.out(); y.f(); cout“static i=“B:iendl; cout“static i=“x.iendl

25、; /cout“static i=“y.iendl; ,static int i;,静态数据成员,int B:i=0;,#include class B public: static void Add() i+ ; static int i; void out() cout“static i=“iendl; ; int B:i=0; class D : private B public: void f(); i=5; Add(); B:i+; B:Add(); ;,/例7-5 在派生类中访问静态成员,void main() B x; D y; x.Add(); x.out(); y.f();

26、cout“static i=“B:iendl; cout“static i=“x.iendl; /cout“static i=“y.iendl; ,i=5;,i 是类D的私有静态数据成员类中可见,#include class B public: static void Add() i+ ; static int i; void out() cout“static i=“iendl; ; int B:i=0; class D : private B public: void f(); i=5; Add(); B:i+; B:Add(); ;,/例7-5 在派生类中访问静态成员,void main

27、() B x; D y; x.Add(); x.out(); y.f(); cout“static i=“B:iendl; cout“static i=“x.iendl; /cout“static i=“y.iendl; ,Add();,Add()是类D的私有静态成员函数类中可调用,#include class B public: static void Add() i+ ; static int i; void out() cout“static i=“iendl; ; int B:i=0; class D : private B public: void f(); i=5; Add();

28、B:i+; B:Add(); ;,/例7-5 在派生类中访问静态成员,void main() B x; D y; x.Add(); x.out(); y.f(); cout“static i=“B:iendl; cout“static i=“x.iendl; /cout“static i=“y.iendl; ,B:i+; B:Add();,访问B类的静态成员,#include class B public: static void Add() i+ ; static int i; void out() cout“static i=“iendl; ; int B:i=0; class D : p

29、rivate B public: void f(); i=5; Add(); B:i+; B:Add(); ;,/例7-5 在派生类中访问静态成员,void main() B x; D y; x.Add(); x.out(); y.f(); cout“static i=“B:iendl; cout“static i=“x.iendl; /cout“static i=“y.iendl; ,cout“static i=“B:iendl;,访问B类的静态数据成员,#include class B public: static void Add() i+ ; static int i; void ou

30、t() cout“static i=“iendl; ; int B:i=0; class D : private B public: void f(); i=5; Add(); B:i+; B:Add(); ;,/例7-5 在派生类中访问静态成员,void main() B x; D y; x.Add(); x.out(); y.f(); cout“static i=“B:iendl; cout“static i=“x.iendl; /cout“static i=“y.iendl; ,cout“static i=“x.iendl;,通过B类对象访问静态数据成员,#include class B

31、 public: static void Add() i+ ; static int i; void out() cout“static i=“iendl; ; int B:i=0; class D : private B public: void f(); i=5; Add(); B:i+; B:Add(); ;,/例7-5 在派生类中访问静态成员,void main() B x; D y; x.Add(); x.out(); y.f(); cout“static i=“B:iendl; cout“static i=“x.iendl; /cout“static i=“y.iendl; ,/c

32、out“static i=“y.iendl;,错误,i 是类D的私有静态数据成员,#include class B public: static void Add() i+ ; static int i; void out() cout“static i=“iendl; ; int B:i=0; class D : private B public: void f(); i=5; Add(); B:i+; B:Add(); ;,/例7-5 在派生类中访问静态成员,void main() B x; D y; x.Add(); x.out(); y.f(); cout“static i=“B:ie

33、ndl; cout“static i=“x.iendl; /cout“static i=“y.iendl; ,#include class B public: static void Add() i+ ; static int i; void out() cout“static i=“iendl; ; int B:i=0; class D : private B public: void f(); i=5; Add(); B:i+; B:Add(); ;,/例7-5 在派生类中访问静态成员,void main() B x; D y; x.Add(); x.out(); y.f(); cout“

34、static i=“B:iendl; cout“static i=“x.iendl; /cout“static i=“y.iendl; ,#include class B public: static void Add() i+ ; static int i; void out() cout“static i=“iendl; ; int B:i=0; class D : private B public: void f(); i=5; Add(); B:i+; B:Add(); ;,/例7-5 在派生类中访问静态成员,void main() B x; D y; x.Add(); x.out()

35、; y.f(); cout“static i=“B:iendl; cout“static i=“x.iendl; /cout“static i=“y.iendl; ,7.3 基类的初始化,建立一个类层次后,通常创建某个派生类的对象,包括使用基类的数据和函数 C+提供一种机制,在创建派生类对象时用指定参数调用基类的构造函数来初始化派生类继承基类的数据 派生类构造函数声明为 派生类构造函数 ( 变元表 ) : 基类 ( 变元表 ) , 对象成员1( 变元表 ) 对象成员n ( 变元表 ) ; 构造函数执行顺序:基类 对象成员 派生类,/ 例7-6 调用构造函数顺序测试,构造函数无参数 #inclu

36、de class Base public : Base ( ) cout “Base created.n“ ; ; class D_class : public Base public : D_class ( ) cout “D_class created.n“ ; ; void main ( ) D_class d1 ; ,7.3 基类的初始化,/ 例7-6 调用构造函数顺序测试,构造函数无参数 #include class Base public : Base ( ) cout “Base created.n“ ; ; class D_class : public Base public

37、: D_class ( ) cout “D_class created.n“ ; ; void main ( ) D_class d1 ; ,7.3 基类的初始化,/ 例7-6 调用构造函数顺序测试,构造函数无参数 #include class Base public : Base ( ) cout “Base created.n“ ; ; class D_class : public Base public : D_class ( ) cout “D_class created.n“ ; ; void main ( ) D_class d1 ; , 调用基类构造函数,7.3 基类的初始化,/

38、 例7-6 调用构造函数顺序测试,构造函数无参数 #include class Base public : Base ( ) cout “Base created.n“ ; ; class D_class : public Base public : D_class ( ) cout “D_class created.n“ ; ; void main ( ) D_class d1 ; , 调用派生类构造函数,7.3 基类的初始化,#include class parent_class int data1 , data2 ; public : parent_class ( int p1 , in

39、t p2 ) data1 = p1; data2 = p2; int inc1 () return + data1; int inc2 () return + data2 ; void display () cout “data1=“ data1 “ , data2=“ data2 endl ; ; class derived_class : private parent_class int data3 ; parent_class data4 ; public: derived_class ( int p1 , int p2 , int p3 , int p4 , int p5 ): par

40、ent_class ( p1 , p2 ) , data4 ( p3 , p4 ) data3 = p5 ; int inc1 ( ) return parent_class : inc1 ( ) ; int inc3 ( ) return + data3 ; void display ( ) parent_class : display ( ) ; data4.display ( ) ; cout “data3=“ data3 endl ; ; void main ( ) derived_class d1 ( 17 , 18 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ;

41、d1 . display ( ) ; ,例7-7 带参数构造函数调用顺序测试,7.3 基类的初始化,#include class parent_class int data1 , data2 ; public : parent_class ( int p1 , int p2 ) data1 = p1; data2 = p2; int inc1 () return + data1; int inc2 () return + data2 ; void display () cout “data1=“ data1 “ , data2=“ data2 endl ; ; class derived_cl

42、ass : private parent_class int data3 ; parent_class data4 ; public: derived_class ( int p1 , int p2 , int p3 , int p4 , int p5 ): parent_class ( p1 , p2 ) , data4 ( p3 , p4 ) data3 = p5 ; int inc1 ( ) return parent_class : inc1 ( ) ; int inc3 ( ) return + data3 ; void display ( ) parent_class : disp

43、lay ( ) ; data4.display ( ) ; cout “data3=“ data3 endl ; ; void main ( ) derived_class d1 ( 17 , 18 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ; d1 . display ( ) ; ,例7-7 带参数构造函数调用顺序测试,7.3 基类的初始化,int data1 , data2 ;,int data3 ;,parent_class data4 ;,例7-7 带参数构造函数调用顺序测试,#include class parent_class int data1 , data2

44、 ; public : parent_class ( int p1 , int p2 ) data1 = p1; data2 = p2; int inc1 () return + data1; int inc2 () return + data2 ; void display () cout “data1=“ data1 “ , data2=“ data2 endl ; ; class derived_class : private parent_class int data3 ; parent_class data4 ; public: derived_class ( int p1 , in

45、t p2 , int p3 , int p4 , int p5 ): parent_class ( p1 , p2 ) , data4 ( p3 , p4 ) data3 = p5 ; int inc1 ( ) return parent_class : inc1 ( ) ; int inc3 ( ) return + data3 ; void display ( ) parent_class : display ( ) ; data4.display ( ) ; cout “data3=“ data3 endl ; ; void main ( ) derived_class d1 ( 17 , 18 , 1 , 2 , -5 ) ; d1 . inc1 ( ) ; d1 . display ( ) ; ,class parent_class int data1 , data2 ; public : parent_class ( int p1 , int p2 ) data1 = p1; da

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1