(正版)03C课件继承多继承

上传人:哈**** 文档编号:137325597 上传时间:2020-07-07 格式:PPT 页数:21 大小:516KB
返回 下载 相关 举报
(正版)03C课件继承多继承_第1页
第1页 / 共21页
(正版)03C课件继承多继承_第2页
第2页 / 共21页
(正版)03C课件继承多继承_第3页
第3页 / 共21页
(正版)03C课件继承多继承_第4页
第4页 / 共21页
(正版)03C课件继承多继承_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《(正版)03C课件继承多继承》由会员分享,可在线阅读,更多相关《(正版)03C课件继承多继承(21页珍藏版)》请在金锄头文库上搜索。

1、继承与派生,继承与派生,1 继承概述 2 基类和派生类 3 派生类的构造与析构 4 多继承,多继承举例,兼职技术人员,管理人员,销售人员,销售经理,雇员,多继承,一个类有多个直接基类的继承关系称为多继承 多继承声明语法 class 派生类名 : 访问控制 基类名1 , , 访问控制 基类名n 数据成员和成员函数声明 ;,多继承,class C : public A ,public B,类 C 可以根据访问控制同时继承类 A 和类 B 的成员, 并添加自己的成员,多继承的简单应用,class Base1 public: Base1(int x) value = x ; int getData()

2、 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 Base1, public Base2 public : Derived ( int, char, double ) ; double getReal() const ; private : d

3、ouble real ; ; void main() Base1 b1 ( 10 ) ; Base2 b2 ( k ) ; Derived d ( 5, A, 2.5 ) ; ,多个基类的派生类构造函数用初始化列表调用基类构造函数,执行顺序与单继承构造函数情况类似。 多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。按基类在被继承时所声明的次序从左到右依次调用。,多继承的派生类构造,一个派生类对象拥有多个直接或间接基类的成员。 不同名成员访问不会出现二义性。 如果不同的基类有同名成员,派生类对象访问时应该加 以识别。,多继承的派生类访问,由于多继承情况下,可能造成对基类中

4、某个成员的访问出现了不惟一的情况,则称为对基类成员访问的二义性问题。,多重继承图示,C,A:f(); B:f(); B:g(); g( ); h( );,二义性和支配原则,class C: public A,public B public: void g(); void h(); ;,若有C obj; 则对函数 f()的访问是二义的: obj.f();,class A public: void f(); ;,class B public: void f(); void g(); ;,二义性和支配原则,1. 同名成员的二义性 不同基类中有同名函数,使用基类名可避免这种二义: 基类与派生类同名函数

5、 这种用基类名来控制成员访问的规则称为支配原则。,void C : : f ( ) A : : f ( ); / B : : f ( ); ,obj.A:f(); obj.B:f();,obj.g(); /隐含用C的g() obj.B:g(); /用B的g(),二义性和支配原则,2. 同一基类被多次继承产生的二义性 一个类不能从同一类直接继承二次或更多次。,class C : public B1 ,public B2,class B,class B public : int b ; ; class B1 : public B int b1 ; ; class B2 : public B int

6、 b2 ; ; class C : public B1 , public B2 public : int f ( ) ; private : int d ; ;,有: C obj ; obj . b ;/ error ojb. 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 ; ;

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

8、处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象,要使这个公共基类在派生类中只产生一个子对象,必须将这个基类 声明为虚基类。,虚基类声明使用关键字 virtual,例如: class B public : int b ; ; class B1 : virtual public B int b1 ; ; class B2 : virtual public B int b2 ; ; class C : public B1 , public B2 private : float d ; ;,有: cc . b/ C cc,class C d ,class B b ,由于类 C 的对象中只

9、有一个 B 类子对象,名字 b 被约束到该子对象上, 所以,当以不同路径使用名字 b 访问 B 类的子对象时,所访问的都是 那个唯一的基类子对象。即cc . B1 : b 和 cc . B2 : b 引用是同一个基类 B 的子对象,二义性和支配原则,例如: 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 : floa

10、t d ; ;,class C d ,class B b ,带有虚基类的派生类 C 的对象的存储结构示意,二义性和支配原则,#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

11、main ( ) D dd ; ,例8 虚继承的测试,两次调用 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

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

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

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