C++讲义:第七章 继承性和派生性

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

派生类构造函数的调用顺序: 派生类构造函数的调用顺序:

基类的构造函数 子对象类的构造函数 派生类构造函数
• •
程序举例
#include <iostream.h> class A {public : A() { cout<<“A constructor ”<<endl; }}; class B : public A { public : B() {cout<<“B constructor”<<endl; } }; void main( ) { B b; } 结果: 结果: A Constructor B Constructor
派生类的定义格式: 二.派生类的定义格式: 派生类的定义格式 1.单继承的定义格式 单继承的定义格式 class <派生类名 :<继承方式 <基 派生类名> 继承方式> 基 派生类名 继承方式 类名> 类名 { <派生类新定义成员 }; 派生类新定义成员> ; 派生类新定义成员 2.继承方式 继承方式 public :表示共有的基类 表示共有的基类 private : 表示私有的基类 protected : 表示保护的基类
#include <iostream.h> Class A { public : A() {cout<<“A Constructor1”<<endl; } A(int i) {x1=i; cout<<“A Constructor2”<<endl;} void dispa() {cout<<“x1=”<<x1<<endl; } private: int x1; }; Class B : public A { public: B() {cout<<“B constructor1”<<endl; }
4.派生类 的对象 能否访问直接基类 中的成员 派生类C的对象 能否访问直接基类B中的成员 派生类 的对象c能否访问直接基类 f2(),i2和j2呢?能否访问间接基类 中的成 , 和 呢 能否访问间接基类A中的成 员f1 () ,j1和i1呢? 和 呢 可以访问直接基类中的f2()和间接基类中的 和间接基类中的 可以访问直接基类中的 f1(),其他的都不可访问。 ,其他的都不可访问。
结果: 结果: A Constructor2 B Constructor2 x1=12 x2=2
2.析构函数 析构函数
析构函数也是不能被继承的 执行顺序: 执行顺序: 派生类的析构函数 基类的析构函数 例如: 例如: #include <iostream.h> class A { public: A() { cout<<“A constructor ”<<endl; } ~ A() { cout<<“A Destructor ”<<endl; } }
void mian() {A a; B b; C c; ………} 问题: 问题: 1.派生类 中的成员函数 ()能否访问基类 中 派生类B中的成员函数 ()能否访问基类 派生类 中的成员函数f2()能否访问基类A中 的成员f1(), (),i1和 呢 的成员 (), 和j1呢? 可以访问f1()和j1,而不可以访问 而不可以访问i1. 可以访问 和 而不可以访问 2.派生类 的对象 能否访问基类 中的成员 (), 派生类B的对象 能否访问基类A中的成员 派生类 的对象b能否访问基类 中的成员f1(), i1和 j1呢? 和 呢 可以访问f1(),但不可访问i1和 。 (),但不可访问 可以访问 (),但不可访问 和j1。
Class B:public A { public: void f2(); B() {i2=20; j2=21; } protected: int j2; private: int i2; Class C: public B {public: void f3(); c() {i3=30;j3=31;} protected:int j3; private: int i3; }; };
总结 公有继承时: 公有继承时: 派生类的成员函数可访问基 类中的公有成员和保护成员; 类中的公有成员和保护成员;派生类的对象 仅可访问基类中的公有成员。 仅可访问基类中的公有成员。 私有继承时: 私有继承时: 派生类的成员函数可访问基 类中的公有成员和保护成员; 类中的公有成员和保护成员;派生类的对象 对基类中的所有成员都不可访问。 对基类中的所有成员都不可访问。 保护继承时: 保护继承时:派生类的成员函数可访问基类 中的公有成员和保护成员; 中的公有成员和保护成员;派生类的对象派 生类的对象对基类中的所有成员都不可访问
三种继承方式之间的差别
不同的继承方式会导致不同访问属性的基类成 员在派生类中的访问属性也有所不同; 员在派生类中的访问属性也有所不同;对于公有继 基类的public和protected成员的访问属性在 承,基类的 和 成员的访问属性在 派生类中不变,而基类的private成员不可访问。 派生类中不变,而基类的 成员不可访问。 成员不可访问 对于私有继承,基类的public和protected成 对于私有继承,基类的 和 成 员都以private成员身份出现在派生类中,而基类的 成员身份出现在派生类中, 员都以 成员身份出现在派生类中 private成员不可访问。 成员不可访问。 成员不可访问 对于保护继承,基类的public和protected成 对于保护继承,基类的 和 成 员都以protected身份出现在派生类中,而基类的 身份出现在派生类中, 员都以 身份出现在派生类中 private成员不可访问。 成员不可访问。 成员不可访问
二.多继承的构造函数 多继承的构造函数
1.派生类的构造函数格式如下: 派生类的构造函数格式如下: 派生类的构造函数格式如下 <派生类名 (<总参数表 ):<基类名 派生类名>( 总参数表 总参数表>) 基类名1> 派生类名 基类名 参数表1>),<基类名 (<参数表 ),.... 基类名2>( 参数表 参数表2>) (<参数表 参数表 基类名 <子对象名 (<参数表 子对象名>( 参数表 参数表n+1>), ... 子对象名 ) { <派生类构造函数体 派生类构造函数体> 派生类构造函数体 }
B(int i) :A(i+10) {x2=i; cout<<“B Constructor2”<<endl; } Void dispb() { dispa(); cout<<“x2=”<<x2<<endl; } private: int x2; }; void main() { B b(2);
b.dispb( ); }
class B { int b ; public: B (int j) { b=j; cout << “B Constructor “ << endl ; } void disp() { cout << “b=” << b<< endl ; } } ;
class C : public B, public A { int c ; public : C ( int k ) : A( k-2 ), B ( k+2 ) { c=k; cout << “ C Constructor “ << endl ; }
3.派生类 中成员函数 f3能否访问直接基类 中 派生类C中成员函数 能否访问直接基类 能否访问直接基类B中 派生类
的成员函数f2()和j2呢?能否访问间接基类 中 和 呢 能否访问间接基类A中 的成员函数 的成员f1(),j1和 i1呢? , 和 的成员 呢
可以访问直接基类中的f2()和j2以及间 可以访问直接基类中的f2()和j2以及间 f2() f1()和j1,而不可访问i2 i1。 i2和 接基类中的 f1()和j1,而不可访问i2和i1。
分析以下程序的执行结果。 例: 分析以下程序的执行结果。
# include <iostream. h> class A { int a ; public : A ( int i ) { a=i; cout << “A Constructor ” << endl ; } }; void disp ( ) { cout << “a= “ <<a<<endl ; }
二.构造函数和析构函数 构造函数和析构函数
1.构造函数 构造函数 构造函数不能够被继承, 构造函数不能够被继承,因此派生类的构造函数必须通过 调用基类的构造函数来初始化基类子对象。 调用基类的构造函数来初始化基类子对象。 派生类构造函数的格式: 派生类构造函数的格式: < 派生类名 (<派生类构造函数总参数表 ): 派生类名> 派生类构造函数总参数表>): 派生类构造函数总参数表 <基类构造函数 基类构造函数>(<参数表 参数表1>),<子对象名 , 子对象名> 基类构造函数 参数表 子对象名 参数表2>) (<参数表 ) 参数表 { <派生类中数据成员的初始化 }; 派生类中数据成员的初始化> ; 派生类中数据成员的初始化
来自百度文库
7.3 多继承
一. 多继承的概念
多继承可以看作是单继承的扩展。 多继承可以看作是单继承的扩展。所 谓多继承是指派生类具有多个基类, 谓多继承是指派生类具有多个基类,派生 类与每个基类之间的关系仍可看作是一个 单继承。 单继承。
1.多继承下派生类的定义格式如下: 多继承下派生类的定义格式如下: 多继承下派生类的定义格式如下 class <派生类名 :<继承方式 派生类名>: 继承方式1><基类名 , 基类名1>, 派生类名 继承方式 基类名 <继承方式 继承方式2><基类名 ,...... 基类名2>, 继承方式 基类名 { <派生类类体 }; 派生类类体> ; 派生类类体
Class B : public A { public : B() { cout<<“B constructor ”<<endl; } ~B(){cout<<“B Destructor”<<endl; } }; Void main() {B b; }
结果: 结果: A Constructor B Constructor B Destructor A Destructor
继承方式
基类特性 Public Protected private Public Protected private Public Protected private
派生类特性 Public Protected 不可访问 Private Private 不可访问 Protected Protected 不可访问
其中, 继承方式 继承方式1><继承方式 、...是三种继 继承方式2>、 是三种继 其中,<继承方式 继承方式 承方式: 之一。 承方式:public, private 和protected之一。 之一
class A { …….. };
class B { …….. };
class C : public A ,public B { …….. };
第七章 继承性和派生类
湖南商学院 信息系 曹伟
本章内容: 本章内容
基类和派生类 单继承 多继承 虚基类
7.1 基类和派生类
一.基本概念 基本概念 1.基类(父类) 基类(父类) 基类 一个已存在的用来派生新类的类. 一个已存在的用来派生新类的类 2.派生类(子类) 派生类( 派生类 子类) 由已存在的类派生出的新类。 由已存在的类派生出的新类。 3.单继承 单继承 从一个基类派生的继承 4.多继承 多继承 从多个基类派生的继承
void disp() { A ::disp(); B ::disp(); cout << “ c= “ << c << endl ; } void main() { C obj ( 10 ) ; } };
公有继承
私有继承
保护继承
7.2 单继承
一.成员访问权限的控制 成员访问权限的控制 #include <iostream.h> class A {public: void f1(); A() {i1=10; j1=11; } protected: int j1; private: int i1; };
相关文档
最新文档