03C课件继承多继承

上传人:仙*** 文档编号:48406715 上传时间:2022-01-04 格式:PPT 页数:21 大小:516.02KB
收藏 版权申诉 举报 下载
03C课件继承多继承_第1页
第1页 / 共21页
03C课件继承多继承_第2页
第2页 / 共21页
03C课件继承多继承_第3页
第3页 / 共21页
资源描述:

《03C课件继承多继承》由会员分享,可在线阅读,更多相关《03C课件继承多继承(21页珍藏版)》请在装配图网上搜索。

1、继承与派生继承与派生1 继承概述2 基类和派生类3 派生类的构造与析构4 多继承多继承多继承举例兼职技术人员 管理人员 销售人员销售经理雇员多继承 一个类有多个直接基类的继承关系称为一个类有多个直接基类的继承关系称为多继承多继承 多继承声明语法多继承声明语法 class 派生类名派生类名 : 访问控制访问控制 基类名基类名1 , , 访问控制访问控制 基类名基类名n 数据成员和成员函数声明数据成员和成员函数声明 ;多继承class C : public A ,public Bclass Aclass B 类类 C 可以根据访问控制同时继承类可以根据访问控制同时继承类 A 和类和类 B 的成员,

2、的成员,并添加自己的成员并添加自己的成员多继承的简单应用多继承的简单应用 class Base1 public: Base1(int x) value = x ; int getData() const return value ; protected: int value;class Base2 public: Base2(char c) letter=c; char getData() const return letter; protected: char letter; 7.5.1 多继承的派生类构造和访问多继承的简单应用多继承的简单应用 class Derived : public

3、Base1, public Base2 public : Derived ( int, char, double ) ; double getReal() const ; private : double real ;void main() Base1 b1 ( 10 ) ; Base2 b2 ( k ) ; Derived d ( 5, A, 2.5 ) ;K2.5A510value letter realBasc1 b1Basc2 b2Derived d 多个基类的派生类构造函数用多个基类的派生类构造函数用初始化列表初始化列表调用基类构造调用基类构造函数,执行顺序与单继承构造函数情况类似。

4、函数,执行顺序与单继承构造函数情况类似。 多个直接基类构造函数执行顺序取决于定义多个直接基类构造函数执行顺序取决于定义派生类时指派生类时指定的各个继承基类的顺序定的各个继承基类的顺序。按基类在被继承时所声明的次。按基类在被继承时所声明的次序从左到右依次调用。序从左到右依次调用。 多继承的派生类构造一个派生类对象拥有多个直接或间接基类的成员。一个派生类对象拥有多个直接或间接基类的成员。不同名成员访问不会出现二义性。不同名成员访问不会出现二义性。如果不同的基类有同名成员,派生类对象访问时应该加如果不同的基类有同名成员,派生类对象访问时应该加 以识别。以识别。 多继承的派生类访问由于多继承情况下,可

5、能造成对基类中某个成员的访问出由于多继承情况下,可能造成对基类中某个成员的访问出现了不惟一的情况,则称为对基类成员访问的二义性问题。现了不惟一的情况,则称为对基类成员访问的二义性问题。多重继承图示Af( )CA:f();B:f(); B:g(); g( ); h( );Bf() ; g( );二义性和支配原则class C: public A,public B public: void g(); void h(); ; 若有若有C C objobj; ; 则对函数则对函数 f()的访问是二义的:()的访问是二义的: obj.f(); class A public: void f(); ; cl

6、ass B public: void f(); void g(); ;二义性和支配原则1. 同名成员的二义性同名成员的二义性n不同基类不同基类中有中有同名同名函数,使用基类名可避免这种二义:函数,使用基类名可避免这种二义:n基类与派生类同名基类与派生类同名函数函数 n这种用基类名来控制成员访问的规则称为这种用基类名来控制成员访问的规则称为支配原则。支配原则。 void C : : f ( ) A : : f ( ); / B : : f ( ); obj.A:f(); obj.B:f(); obj.g(); /隐含用隐含用C的的g()()obj.B:g(); /用用B的的g()()二义性和支配

7、原则2. 同一基类被多次继承产生的二义性同一基类被多次继承产生的二义性 一个类不能从同一类直接继承二次或更多次。一个类不能从同一类直接继承二次或更多次。 class C : public B1 ,public B2class B1class B2class Bclass B public : int b ; ;class B1 : public B int b1 ; ;class B2 : public B int b2 ; ;class C : public B1 , public B2 public : int f ( ) ; private : int d ; ;有:有:C obj ;o

8、bj . b ;/ errorojb. B : b ;/ error,从哪里继承的?,从哪里继承的? class C f () , d class B1 b1 class B2 b2 class B bb class B bb obj.B1 : : b obj.B2 : : b二义性和支配原则例如:例如:class B public : int b ; ;class B1 : public B int b1 ; ;class B2 : public B int b2 ; ;class C : public B1 , public B2 public : int f ( ) ; private

9、: int d ; ;class C f () , d class B1 b1 class B2 b2 class B b class B b c.bc.b1c.bc.b2c.d多重派生类多重派生类 C 的对象的存储结构示意的对象的存储结构示意 建立建立 C 类的对象时,类的对象时,B 的的构造函数将被调用两次:构造函数将被调用两次:分别由分别由B1调和调和 B2 调用,调用,以初始化以初始化 C 类的对象中所类的对象中所包含的两个包含的两个 B 类的子对象类的子对象二义性和支配原则虚基类 如果在多条继承路经上有一个公共的基类,那么在继承如果在多条继承路经上有一个公共的基类,那么在继承路经的某

10、处汇合点,这个公共基类就会在派生类的对象中路经的某处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象产生多个基类子对象 要使这个公共基类在派生类中只产生一个子对象,必须要使这个公共基类在派生类中只产生一个子对象,必须将这个基类将这个基类 声明为声明为虚基类虚基类。 虚基类声明使用关键字虚基类声明使用关键字 virtual例如:例如:class B public : int b ; ;class B1 : virtual public B int b1 ; ;class B2 : virtual public B int b2 ; ;class C : public B1 , publ

11、ic B2 private : float d ; ;有:有:cc . b/ C ccclass C d class B1 b1class B2 b2 class B b 由于类由于类 C 的对象中只有一个的对象中只有一个 B 类子对象,名字类子对象,名字 b 被约束到该子对象上,被约束到该子对象上, 所以,当以不同路径使用名字所以,当以不同路径使用名字 b 访问访问 B 类的子对象时,所访问的都是类的子对象时,所访问的都是 那个唯一的基类子对象。即那个唯一的基类子对象。即cc . B1 : b 和和 cc . B2 : b 引用是同一个基类引用是同一个基类 B 的子对象的子对象二义性和支配原

12、则例如:例如:class B public : int 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.b1 c.b2c.dc.b二义性和支配原则#include c

13、lass A public : A ( ) cout class A endl ; ;class B : public A public : B ( ) cout class B endl ; ;class C : public A public : C ( ) cout class C endl ; ;class D : public B , public C public : D ( ) cout class D endl ; ;void main ( ) D dd ; 例例8 虚继承的测试虚继承的测试class Dclass Bclass C class Aclass A两次调用两次调用

14、A的构造函数的构造函数7.5.2 虚基类#include class A public : A ( ) cout class A endl ; ;class B : public A public : B ( ) cout class B endl ; ;class C : public A public : C ( ) cout class C endl ; ;class D : public B , public C public : D ( ) cout class D endl ; ;void main ( ) D dd ; class Dclass Bclass C class Ac

15、lass A: virtual public Aclass Dclass Bclass C class A一次调用一次调用A的构造函数的构造函数7.5.2 虚基类例例8 虚继承的测试虚继承的测试: virtual public A虚基类的构造函数n由于派生类的对象中只有一个虚基类对象。为保证虚基类由于派生类的对象中只有一个虚基类对象。为保证虚基类对象只被初始化一次,这个虚基类构造函数必须只被调用对象只被初始化一次,这个虚基类构造函数必须只被调用一次。一次。n规定将在建立对象时所指定的类称为规定将在建立对象时所指定的类称为最直接派生类最直接派生类。n虚基类对象是由虚基类对象是由最直接派生类最直接派生类的构造函数通过调用虚基类的构造函数通过调用虚基类的构造函数进行初始化的。的构造函数进行初始化的。n从虚基类直接或间接继承的派生类中的构造函数的成员初从虚基类直接或间接继承的派生类中的构造函数的成员初始化列表中都要列出这个虚基类构造函数的调用。但是,始化列表中都要列出这个虚基类构造函数的调用。但是,只有用于建立对象的那个派生类的构造函数调用虚基类的只有用于建立对象的那个派生类的构造函数调用虚基类的构造函数,而该派生类的基类中所列出的对这个虚基类的构造函数,而该派生类的基类中所列出的对这个虚基类的构造函数调用在执行中被忽略构造函数调用在执行中被忽略。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!