继承--派生类

上传人:kms****20 文档编号:46677393 上传时间:2018-06-27 格式:PDF 页数:57 大小:275.72KB
返回 下载 相关 举报
继承--派生类_第1页
第1页 / 共57页
继承--派生类_第2页
第2页 / 共57页
继承--派生类_第3页
第3页 / 共57页
继承--派生类_第4页
第4页 / 共57页
继承--派生类_第5页
第5页 / 共57页
点击查看更多>>
资源描述

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

1、继承派生类继承派生类复习复习?1.有下面类的说明,有错误的语句是:1.有下面类的说明,有错误的语句是: class Xclass X A) const int a;A) const int a; B) X();B) X(); public:public: C) X(int val) a=2;C) X(int val) a=2; D) X();D) X(); ;答案:答案:C不正确,应改成不正确,应改成 X(int val) : a(2) ;?2.下列静态数据成员的特性中,错误的是2.下列静态数据成员的特性中,错误的是 A)说明静态数据成员时前边要加关键字staticA)说明静态数据成员时前边要

2、加关键字static 来修饰来修饰 B)静态数据成员在类体外进行初始化B)静态数据成员在类体外进行初始化 C)使用静态数据成员时,要在静态数据成员名C)使用静态数据成员时,要在静态数据成员名 前加和作用域运算符前加和作用域运算符 D)静态数据成员不是所有对象所共有的D)静态数据成员不是所有对象所共有的答案:答案:D错误,应该是共有的错误,应该是共有的 C正确,可以是 类名正确,可以是 类名:静态成员 或 对象名静态成员 或 对象名.静态成员静态成员? ?3. 3. 下面程序段输出结果是?下面程序段输出结果是?? ?class A class A ? ? static static intint

3、 countcount; ;? ? ?public:public:? ?A() count+; A() count+; ? ?void void f(intf(int x) count+=x; x) count+=x; ? ?;? ? ?intint A:countA:count=1;=1;? ?A a; A a; ? ?A b;A b;? ?b.f(5);b.f(5);? ?coutcout : ;?为派生类的名字。?为直接基类的名字。?是在派生类中新定义的成员,其中包括对基类 成员的重定义。?指出派生类的实例(对象)用户以及派生类的派 生类对该派生类的基类成员的访问控制class A /基

4、类class A /基类 int x,y;int x,y; public:public: void f();void f(); void g();void g(); ; class B: public A /派生类class B: public A /派生类 int z; /新成员int z; /新成员 public:public: void h(); /新成员void h(); /新成员 ;关于派生类的说明关于派生类的说明?1. 除了拥有新定义的成员外,派生类还拥有基类的 所有成员(基类的构造函数和赋值操作符重载函数除 外)。例如:1. 除了拥有新定义的成员外,派生类还拥有基类的 所有成员(

5、基类的构造函数和赋值操作符重载函数除 外)。例如: B b; b b.x: b.y: b.z:b.f(); /A类中的f b.g(); /A类中的g b.h(); /B类中的h?2. 定义派生类时一定要见到基类的定义。2. 定义派生类时一定要见到基类的定义。 class A; /声明 class B: public A /Error int z; public: void h() g(); /Error,编译程序不知道基类中是否 有函数g以及函数g的原型。 ; . B b; /Error,编译无法确定b所需内存空间的大小。?3. 友元不具有继承性:如果在派生类中没有显式说 明,基类的友元不是派

6、生类的友元;如果基类是另一 个类的友元,而该类没有显式说明,则派生类也不是 该类的友元。3. 友元不具有继承性:如果在派生类中没有显式说 明,基类的友元不是派生类的友元;如果基类是另一 个类的友元,而该类没有显式说明,则派生类也不是 该类的友元。?4. 派生类不能直接访问基类的私有成员。例如:4. 派生类不能直接访问基类的私有成员。例如:class A int x,y; public: void f(); void g() . x . ; class B: public A int z; public: void h() . x . /Error,x为基类的私有成员。 g(); /OK,通过函

7、数g访问基类的私有成员x。 ;?情况1:情况1:?派生类可以定义新的成员,也可以对基类成员重新进行定义。如 果在派生类中新定义的成员与基类的某个成员同名,则在派生类 中对该成员的访问是指派生类中定义的成员。例如:class A /基类class A /基类 int x,y;int x,y; public:public: void f() x=1; cout: ;?继承方式可以是:public、private和protected。?默认的继承方式为:private。继承方式的含义继承方式的含义基类 派生类 继承方式基类 派生类 继承方式publicprivateprotectedpublicpu

8、blicpublicprivateprotectedpublicpublic不可直接访问不可直接访问protectedprivateprivateprotectedprivateprivate不可直接访问不可直接访问privateprotectedprotectedprivateprotectedprotected不可直接访问不可直接访问protectedprotected派生类对基类成员的访问权 原则 (派生类对基类成员的访问权 原则 (1)对基类私有数据不可见 ()对基类私有数据不可见 (2)以最小的权限为准)以最小的权限为准例:派生类的访问权限例:派生类的访问权限class Aclass

9、 A public: public: void a();void a(); protected:protected: void b();void b(); private:private: void c();void c(); ;1. 公有派生:1. 公有派生: class B: class B: publicpublic A A public:public: void d(); void d(); /在B类里,a()和d()是public,b()是protected,c()不可见/在B类里,a()和d()是public,b()是protected,c()不可见 ; B x; x.a(); /

10、OKB x; x.a(); /OK 2. 保护派生:2. 保护派生: class B: class B: protectedprotected A A public:public: void d(); void d(); /在B类里,d()是public, a(),b()是protected,c()不可见/在B类里,d()是public, a(),b()是protected,c()不可见 ; B x; x.a(); /error,a()是protectedB x; x.a(); /error,a()是protected 3. 私有派生:3. 私有派生: class B:class B: pri

11、vateprivate A A public:public: void d(); void d(); /在B类里,d()是public, a(),b()是private,c()不可见/在B类里,d()是public, a(),b()是private,c()不可见 ; B x; x.a(); /error,a()是privateB x; x.a(); /error,a()是private?不管以何种派生方式,B类都可以访问A类的a()和b(),不可访问 c()不管以何种派生方式,B类都可以访问A类的a()和b(),不可访问 c()?在派生类中,可以通过访问声明来调整访问权限在派生类中,可以通过访

12、问声明来调整访问权限?在任何继承方式中,除了基类的private成员,都可进行访问控制调整在任何继承方式中,除了基类的private成员,都可进行访问控制调整?调整的方法:public : protected : private 基类名:,例如调整的方法:public : protected : private 基类名:,例如 class Aclass A public: public: void f1();void f1(); void f2();void f2(); protected:protected: void g1();void g1(); void g2()void g2() p

13、rivate: private: void p1();void p1(); class B: private Aclass B: private A public: public: A:g1;A:g1; A:p1; /A:p1; /ErrorError,private成员不允许调整,private成员不允许调整 protected:protected: A:f2;A:f2; A:g2;A:g2; private:private: A:f1;A:f1; 继承方式的调整继承方式的调整思考:派生类中如何访问基类的私有数据?思考:派生类中如何访问基类的私有数据??方法1:通过基类的接口(公有函数)来访

14、问方法1:通过基类的接口(公有函数)来访问?方法2:把基类的private数据改成protected方法2:把基类的private数据改成protected?方法3:将派生类或其成员函数声明为基类的友元,例如方法3:将派生类或其成员函数声明为基类的友元,例如 class B;class B; class Aclass A private: int x; private: int x; friend class B; / 或friend B:f();friend class B; / 或friend B:f(); class B: public Aclass B: public A void f

15、() x=3 ;void f() x=3 ; 封装与继承的矛盾封装与继承的矛盾?在派生类中定义新的成员时,往往需要用到基 类的一些private成员。(矛盾)在派生类中定义新的成员时,往往需要用到基 类的一些private成员。(矛盾)?在继承机制中,一个类的成员有两种被外界使 用的场合:在继承机制中,一个类的成员有两种被外界使 用的场合:?通过类的对象使用?在派生类中使用?在C+中,提供了另外一种类成员访问控制: protected,用它说明的成员不能被对象使 用,但可以在派生类中使用。在C+中,提供了另外一种类成员访问控制: protected,用它说明的成员不能被对象使 用,但可以在派生类中使用。?protected访问控制缓解了封装与继承的矛盾protected访问控制缓解了封装与继承的矛盾class Aclass A protected:protected: int x,y;int x,y; public:public: void f();void f(); ; class B: public Aclass B: public A . void h()void h() f(); /O

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

当前位置:首页 > 生活休闲 > 科普知识

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