《第7章 继承性和派生类优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第7章 继承性和派生类优秀PPT.ppt(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第7章 继承性和派生类现在学习的是第1页,共56页n保持已有类的特性而构造新类的过程称为继承。保持已有类的特性而构造新类的过程称为继承。n在已有类的基础上新增自己的特性而产生新类的过在已有类的基础上新增自己的特性而产生新类的过程称为派生。程称为派生。n被继承的已有类称为基类(或父类)。被继承的已有类称为基类(或父类)。n派生出的新类称为派生类。派生出的新类称为派生类。7.1 基类和派生类现在学习的是第2页,共56页继承与派生问题举例工具车工具车面包车面包车轿车轿车小汽车小汽车卡车卡车旅行车旅行车汽车汽车交通工具交通工具现在学习的是第3页,共56页继承与派生问题举例猴子猴子老虎老虎豹豹狮狮 子子
2、猫猫鸟鸟动物动物现在学习的是第4页,共56页继承与派生问题举例圆圆矩形矩形几何形状几何形状现在学习的是第5页,共56页继承与派生问题举例兼职技术人员兼职技术人员销售经理销售经理管理人员管理人员销售人员销售人员雇员雇员现在学习的是第6页,共56页继承与派生的目的n继承的目的:实现代码重用。继承的目的:实现代码重用。n派生的目的:当新的问题出现,原有程派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需序无法解决(或不能完全解决)时,需要对原有程序进行改造。要对原有程序进行改造。现在学习的是第7页,共56页n继承关系,描述了派生类与基类之间的继承关系,描述了派生类与基类之间的“是是
3、”关系,派生类是基类中的一种,是它的具体关系,派生类是基类中的一种,是它的具体化。化。n组合关系,又称包含关系,一个类中有另一组合关系,又称包含关系,一个类中有另一个类中的对象,表现两者之间的个类中的对象,表现两者之间的“有有”的关系。的关系。类与类之间的关系现在学习的是第8页,共56页单重继承和多重继承单重继承和多重继承继承可分为:继承可分为:n单重继承,指生成的派生类只有一个基类。单重继承,指生成的派生类只有一个基类。n多重继承,是指生成的派生类有两个或两个以多重继承,是指生成的派生类有两个或两个以上的基类。上的基类。两者的区别仅在于所继承基类数不同两者的区别仅在于所继承基类数不同现在学习
4、的是第9页,共56页 派生类定义格式如下:派生类定义格式如下:class class :;7.1.1 派生类的定义现在学习的是第10页,共56页n不同继承方式的影响主要体现在不同继承方式的影响主要体现在n派生类成员派生类成员对基类成员的访问权限对基类成员的访问权限n通过通过派生类对象派生类对象对基类成员的访问权限对基类成员的访问权限n继承方式包含以下继承方式包含以下3 3种:种:publicpublic(公有的方式);(公有的方式);privateprivate(私有的方式);(私有的方式);protectedprotected(保护的方式)。(保护的方式)。n默认方式:对默认方式:对clas
5、sclass来讲是来讲是privateprivate;对;对structstruct来讲是来讲是publicpublic。7.1.2 派生类的三种继承方式现在学习的是第11页,共56页 基类中的私有成员无论哪种继承方式在派生类中都是不基类中的私有成员无论哪种继承方式在派生类中都是不能直接访问的。能直接访问的。在公有继承方式下,基类中公有成员和保护成员在在公有继承方式下,基类中公有成员和保护成员在派生类中仍然是公有成员和保护成员。派生类中仍然是公有成员和保护成员。在私有继承方式下,基类中公有成员和保护成员在派在私有继承方式下,基类中公有成员和保护成员在派生类中都为私有成员。生类中都为私有成员。在
6、保护继承方式下,基类中公有成员和保护成员在派在保护继承方式下,基类中公有成员和保护成员在派生类中都为保护成员。生类中都为保护成员。7.1.3 基类成员在派生类中的访问权限现在学习的是第12页,共56页 基类成员在派生类中访问权限基类成员在派生类中访问权限 基类私有不可访问,公有不变,私有私有,保护保护。基类私有不可访问,公有不变,私有私有,保护保护。基类中成员基类中成员公有继承公有继承私有继承私有继承保护继承保护继承私成员私成员不可访问不可访问不可访问不可访问不可访问不可访问公成员公成员公有公有私有私有保护保护保护成员保护成员保护保护私有私有保护保护现在学习的是第13页,共56页7.1.4 成
7、员访问权限的控制(1)(1)公有继承方式公有继承方式class Pointclass Point/基类基类基类基类PointPoint类的声明类的声明类的声明类的声明public:public:/公有函数成员公有函数成员公有函数成员公有函数成员void InitP(float xx=0,float yy=0)X=xx;Y=yy;void InitP(float xx=0,float yy=0)X=xx;Y=yy;void Move(float xOff,float yOff)X+=xOff;Y+=yOff;void Move(float xOff,float yOff)X+=xOff;Y+=y
8、Off;float GetX()return X;float GetX()return X;float GetY()return Y;float GetY()return Y;private:private:/私有数据成员私有数据成员私有数据成员私有数据成员float X,Y;float X,Y;例例1现在学习的是第14页,共56页class Rectangle:public Point /class Rectangle:public Point /派生类声明派生类声明派生类声明派生类声明 public:public:/新增公有函数成员新增公有函数成员新增公有函数成员新增公有函数成员void
9、InitR(float x,float y,float w,float h)void InitR(float x,float y,float w,float h)InitPInitP(x,y);W=w;H=h;(x,y);W=w;H=h;/调用基类公有成员函数调用基类公有成员函数调用基类公有成员函数调用基类公有成员函数float GetH()return H;float GetH()return H;float GetW()return W;float GetW()return W;private:private:/新增私有数据成员新增私有数据成员新增私有数据成员新增私有数据成员float W
10、,H;float W,H;例例1现在学习的是第15页,共56页#include#include#include#includeusing namecpace std;using namecpace std;int main()int main()Rectangle rect;Rectangle rect;rect.InitR(2,3,20,10);rect.InitR(2,3,20,10);/通过派生类对象访问基类公有成员通过派生类对象访问基类公有成员通过派生类对象访问基类公有成员通过派生类对象访问基类公有成员rect.Move(3,2);rect.Move(3,2);coutrect.Get
11、X(),rect.GetY(),coutrect.GetX(),rect.GetY(),rect.GetH(),rect.GetW()endl;rect.GetH(),rect.GetW()endl;return 0;return 0;例例1现在学习的是第16页,共56页 class B:public A public:void f2();protected:int j2;private:int i2;class C:public B public:void f3();#include#include class A class A public:public:void f1();void f
12、1();protected:protected:int j1;int j1;private:private:int i1;int i1;例例2现在学习的是第17页,共56页 class B:A/class默默认私有私有继承承 public:void h()coutBn;A:f;/引入本作用域引入本作用域 ;void main()B b;b.f(10);b.g();/错 b.h();#include#include class A class A public:public:void f(int i)void f(int i)coutiendl;coutiendl;void g()void g(
13、)coutAn;coutAn;(2 2)私有继承方式)私有继承方式现在学习的是第18页,共56页(3)保护继承方式nprotected protected 成员的特点与作用成员的特点与作用n对建立其所在类对象的模块来说,它与对建立其所在类对象的模块来说,它与 private private 成员的性质相同。成员的性质相同。n对于其派生类来说,它与对于其派生类来说,它与 public public 成员的性质成员的性质相同。相同。n既实现了数据隐藏,又方便继承,实现代既实现了数据隐藏,又方便继承,实现代码重用。码重用。现在学习的是第19页,共56页 class B:protected A pub
14、lic:B(const char*str):A(str)void Print()coutnameendl;void main()B b(Zhang);b.Print();#include#include#include#include class A class A public:public:A(const char*str)A(const char*str)strcpy(name,str);strcpy(name,str);protected:protected:char name80;char name80;现在学习的是第20页,共56页 class C:protected B publ
15、ic:void f4();protected:int c1;private:int c2;class D:private C public:void f5();protected:int d1;private:int d2;例例 分析下列程序,并填写不同成员在不同类的访问权限。分析下列程序,并填写不同成员在不同类的访问权限。#include#include class A class A public:public:void f1();void f1();protected:protected:int a1;int a1;private:private:int a2;int a2;class
16、B:public A class B:public A public:public:void f2();void f2();protected:protected:void f3();void f3();private:private:int b;int b;现在学习的是第21页,共56页 成成员类员类f1f1()()a1a1a2a2f2f2()()f3f3()()b bf4f4()()c1c1c2c2f5f5()()d1d1d2d2类类A A(基(基类类)公公有有保保护护私私有有类类B B(公(公继继)公公有有保保护护不不可可访访公公有有保保护护私私有有类类C C(保(保继继)公公有有保保护
17、护私私有有类类D D(私(私继继)公公有有保保护护私私有有现在学习的是第22页,共56页单重继承指的是仅有一个基类的派生继承。单重继承指的是仅有一个基类的派生继承。猴子猴子狮子狮子虎虎猎豹猎豹猫猫鸟鸟动物动物7.2 单继承现在学习的是第23页,共56页n构造函数不能继承。构造函数不能继承。n派生类的构造函数承担着对基类中数据成员初始化和派生类的构造函数承担着对基类中数据成员初始化和对派生类自身数据成员初始化的双重任务。对派生类自身数据成员初始化的双重任务。n析构函数不能继承。析构函数不能继承。n派生类的析构函数应包含着基类的析构函数,用来派生类的析构函数应包含着基类的析构函数,用来释放基类中的
18、数据成员。释放基类中的数据成员。7.2.1 派生类的构造函数和析构函数现在学习的是第24页,共56页n派生类的构造函数应该包含它的直接基类的构造派生类的构造函数应该包含它的直接基类的构造函数。定义格式如下:函数。定义格式如下:():):(),1 1派生类的构造函数派生类的构造函数7.2.1 派生类的构造函数和析构函数现在学习的是第25页,共56页 派生类构造函数的执行顺序如下:派生类构造函数的执行顺序如下:n 先执行基类构造函数;先执行基类构造函数;n再执行子对象的构造函数(如有子对象的话);再执行子对象的构造函数(如有子对象的话);n最后执行派生类构造函数的函数体。最后执行派生类构造函数的函
19、数体。掌握派生类构造函数时应注意如下两点 派生类构造函数的成员初始化列表中应该显式地包含派生类构造函数的成员初始化列表中应该显式地包含基类中带参数的构造函数,或者隐含地包含基类中的默基类中带参数的构造函数,或者隐含地包含基类中的默认构造函数。认构造函数。现在学习的是第26页,共56页n由于析构函数不能继承,因此在派生类的析构函数中要由于析构函数不能继承,因此在派生类的析构函数中要包含它的直接基类的析构函数。包含它的直接基类的析构函数。n派生类析构函数的执行顺序如下:派生类析构函数的执行顺序如下:2 2派生类的析构函数派生类的析构函数n最后执行直接基类中的析构函数。最后执行直接基类中的析构函数。
20、n再执行子对象所在类的析构函数(如果有子对象的话)再执行子对象所在类的析构函数(如果有子对象的话)n先执行派生类析构函数的函数体先执行派生类析构函数的函数体现在学习的是第27页,共56页例例例例 派生类构造函数的执行顺序派生类构造函数的执行顺序派生类构造函数的执行顺序派生类构造函数的执行顺序#include#include class A class A public:public:A()A()a=0;a=0;coutDefault constructor called.aendl;coutDefault constructor called.aendl;A(int i)A(int i)a=i
21、;a=i;coutConstructor called.aendl;coutConstructor called.aendl;A()coutDestructor called.aendl;A()coutDestructor called.aendl;void Print()couta,;void Print()couta,;int Geta()return a;int Geta()return a;private:private:int a;int a;现在学习的是第28页,共56页 void main()B bb2;bb0=B(7,8,9);bb1=B(12,13,14);for(int i
22、=0;i2;i+)bbi.Print();class B:public Aclass B:public A public:public:B()B()b=0;b=0;coutDefault constructor called.bendl;coutDefault constructor called.bendl;B(int i,int j,int k):A(i),aa(j)B(int i,int j,int k):A(i),aa(j)b=k;b=k;coutConstructor called.bendl;coutConstructor called.bendl;B()coutDestructo
23、r called.bendl;B()coutDestructor called.bendl;void Print()void Print()A:Print();A:Print();coutb,aa.Geta()endl;coutb,aa.Geta()endl;private:private:int b;int b;A aa;A aa;现在学习的是第29页,共56页 class B:public A public:B()b1=b2=0;B(int i)b1=0;b2=i;B(int i,int j,int k):A(i),b1(j),b2(k)B()coutIn B.n;void Print()
24、A:Print();coutb1,b2,;private:int b1,b2;例例例例 多层派生类构造函数和析构函数。多层派生类构造函数和析构函数。多层派生类构造函数和析构函数。多层派生类构造函数和析构函数。#include#include class A class A public:public:A()A()a=0;a=0;A(int i)A(int i)a=i;a=i;A()A()coutIn A.n;coutIn A.n;void Print()void Print()couta,;couta,;private:private:int a;int a;现在学习的是第30页,共56页 v
25、oid main()C c1;C c2(10);C c3(10,20,30,40);c1.Print();c2.Print();c3.Print();class C:public Bclass C:public B public:public:C()C()c=0;c=0;C(int i)C(int i)c=i;c=i;C(int i,int j,int k,int l):B(i,j,k),c(l)C(int i,int j,int k,int l):B(i,j,k),c(l)C()C()coutIn C.n;coutIn C.n;void Print()void Print()B:Print(
26、);B:Print();coutcendl;coutcendl;private:private:int c;int c;现在学习的是第31页,共56页1 1子类型子类型7.2.2 7.2.2 子类型和赋值兼容规则子类型和赋值兼容规则n当一个类型至少包含了另一个类型的所有行为,则称当一个类型至少包含了另一个类型的所有行为,则称该类型是另一个类型的子类型。该类型是另一个类型的子类型。n例如,在公有继承下,派生类是基类的子类型。例如,在公有继承下,派生类是基类的子类型。n如果类型如果类型A A是类型是类型B B的子类型,则称类型的子类型,则称类型A A适应于类型适应于类型B B,这时用类型,这时用类
27、型B B对象的操作也可以用于类型对象的操作也可以用于类型A A的对象。的对象。因此,可以说类型因此,可以说类型A A的对象就是类型的对象就是类型B B的对象。的对象。n子类型的关系是不可逆的。子类型的关系是不可逆的。现在学习的是第32页,共56页2.类型适应n类型适应是指两种类型之间的关系类型适应是指两种类型之间的关系nB B类型适应类型适应A A类型是指类型是指B B类型的对象能够用于类型的对象能够用于A A类型的对象所能使用的场合。类型的对象所能使用的场合。n子类型与类型适应是一致的。子类型与类型适应是一致的。现在学习的是第33页,共56页n当类型当类型B B是类型是类型A A的子类型时,
28、则满足下述的的子类型时,则满足下述的赋值兼容规则。赋值兼容规则。B B类的对象可以赋值给类的对象可以赋值给A A类的对象。类的对象。B B类的对象可以给类的对象可以给A A类对象引用赋值。类对象引用赋值。B B类的对象地址值可以给类的对象地址值可以给A A类对象指针赋类对象指针赋值。值。n通过基类对象名、指针、引用只能使用从基通过基类对象名、指针、引用只能使用从基类继承的成员类继承的成员 3赋值兼容规则现在学习的是第34页,共56页 class B:public A public:B()b=0;B(int i,int j):A(i),b(j)void Print()coutb,;A:Print
29、();private:int b;void fun(A&a)couta.Geta()+2Print();fun(*pb);delete pa;例例例例 分析下列程序的输出结果,熟悉赋值兼容规则在该程序中的使用。分析下列程序的输出结果,熟悉赋值兼容规则在该程序中的使用。分析下列程序的输出结果,熟悉赋值兼容规则在该程序中的使用。分析下列程序的输出结果,熟悉赋值兼容规则在该程序中的使用。#include#include class A class A public:public:A()A()a=0;a=0;A(int i)A(int i)a=i;a=i;void Print()void Print(
30、)coutaendl;coutaendl;int Geta()int Geta()return a;return a;private:private:int a;int a;现在学习的是第35页,共56页轮船类轮船类水路两用车类水路两用车类汽车类汽车类7.3 多继承7.3.1 7.3.1 多继承多继承的概念的概念现在学习的是第36页,共56页n多继承派生类构造函数格式如下:多继承派生类构造函数格式如下:():):(),),(),2),7.3.1 多继承的构造函数和析构函数现在学习的是第37页,共56页n在多重继承派生类构造函数中,先执行基类的构造函在多重继承派生类构造函数中,先执行基类的构造函
31、数。多个基类构造函数的执行顺序取决于定义派生类数。多个基类构造函数的执行顺序取决于定义派生类时规定的先后顺序,与派生类的成员初始化列表中顺时规定的先后顺序,与派生类的成员初始化列表中顺序无关。序无关。n派生类构造函数中可以隐含着直接基类的默认构造函派生类构造函数中可以隐含着直接基类的默认构造函数。数。n多重继承派生类的析构函数中隐含着直接基类的析构函多重继承派生类的析构函数中隐含着直接基类的析构函数,但其执行顺序与构造函数相反。数,但其执行顺序与构造函数相反。7.3.1 多继承的构造函数和析构函数现在学习的是第38页,共56页 class B public:B(int i)b=i;coutCo
32、nstructor called.Bn;B()coutDestructor called.Bn;void Print()coutbendl;private:int b;例例例例 熟悉多重继承派生类构造函数和析构函数的用法。熟悉多重继承派生类构造函数和析构函数的用法。熟悉多重继承派生类构造函数和析构函数的用法。熟悉多重继承派生类构造函数和析构函数的用法。#include#include class A class A public:public:A(int i)A(int i)a=i;a=i;coutConstructor called.An;coutConstructor called.An;
33、A()A()coutDestructor called.An;coutDestructor called.An;void Print()void Print()coutaendl;coutaendl;private:private:int a;int a;现在学习的是第39页,共56页 class D:public A,public B public:D(int i,int j,int k,int l):B(i),A(j),c(l)d=k;coutConstructor called.Dn;D()coutDestructor called.Dn;void Print()A:Print();B:
34、Print();coutd,c.Getc()endl;private:int d;C c;void main()D d(5,6,7,8);d.Print();B b(2);b=d;b.Print();class Cclass C public:public:C(int i)C(int i)c=i;c=i;coutConstructor called.Cn;coutConstructor called.Cn;C()C()coutDestructor called.Cn;coutDestructor called.Cn;int Getc()int Getc()return c;return c;p
35、rivate:private:int c;int c;现在学习的是第40页,共56页 在多重继承时,在下面两种情况情况下,可能出现派生在多重继承时,在下面两种情况情况下,可能出现派生类对基类成员访问的二义性。类对基类成员访问的二义性。1 1调用不同基类中的相同成员时可能出调用不同基类中的相同成员时可能出现二义性现二义性 7.3.2 多继承的二义性现在学习的是第41页,共56页 class D:public A,public B public:void g()coutDD.n;void h()B:f();void main()D d;d.A:f();d.g();d.h();例例例例 分析下列程序
36、的输出结果分析下列程序的输出结果分析下列程序的输出结果分析下列程序的输出结果#include#include class A class A public:public:void f()void f()coutA.n;coutA.n;class B class B public:public:void f()void f()coutB.n;coutB.n;void g()void g()coutBB.n;coutBB.n;现在学习的是第42页,共56页 2 2访问共同基类的成员时可能出现二访问共同基类的成员时可能出现二义性义性 当一个派生类中有多个基类,而这些基类又当一个派生类中有多个基类,而
37、这些基类又有一个共同的基类时,访问这个公共基类中的有一个共同的基类时,访问这个公共基类中的成员时,可能出现二义性。成员时,可能出现二义性。A AB BC CD D现在学习的是第43页,共56页二义性问题举例class Bclass B public:public:int b;int b;class B1:public Bclass B1:public B private:private:int b1;int b1;class B2:public Bclass B2:public B private:private:int b2;int b2;class C:public B1,public B
38、2class C:public B1,public B2 public:public:int f();int f();private:private:int d;int d;现在学习的是第44页,共56页n派生类C的对象的存储结构示意图:bb1bb2dB类成员B类成员B1类成员B2类成员C类对象n有二义性:nC c;nc.bnc.B:b无二义性:无二义性:c.B1:bc.B2:b45现在学习的是第45页,共56页7.4 虚基类7.4.1 7.4.1 虚基类的引入和说明虚基类的引入和说明虚基类的引入虚基类的引入 :用于有共同基类的场合用于有共同基类的场合声明声明以以virtualvirtual修
39、饰说明基类修饰说明基类例:例:class B1:virtual public Bclass B1:virtual public B作用作用主要用来解决多继承时可能发生的对同一基类继承多次而产生主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题的二义性问题.为最远的派生类提供维一的基类成员,而不重复产生多次拷贝为最远的派生类提供维一的基类成员,而不重复产生多次拷贝注意:注意:n在第一级继承时就要将共同基类设计为虚基类。在第一级继承时就要将共同基类设计为虚基类。现在学习的是第46页,共56页虚基类举例nclass B private:int b;nclass B1:virtual
40、public B private:int b1;nclass B2:virtual public B private:int b2;nclass C:public B1,public B2 private:float d;n下面的访问是正确的:nC cobj;ncobj.b;现在学习的是第47页,共56页n虚基类的派生类对象存储结构示意图:BB1B2Cb1b2dB1类成员B2类成员C类对象bB类成员48现在学习的是第48页,共56页虚基类举例D1nV:int nVd:intB1:nV1:intB2:nV2:intfund():voidfun():voidB1nV1:intB2nV2:intD1
41、nVd:intfund():void B0nV:intfun()现在学习的是第49页,共56页B0B1新增成员B0B2新增成员D1新增成员B0B0B1B2D1nV,fun()50现在学习的是第50页,共56页51#include#include using namecpace std;using namecpace std;class B0class B0/声明基类声明基类声明基类声明基类B0B0 public:public:/外部接口外部接口外部接口外部接口int nV;int nV;void fun()coutMember of B0endl;void fun()coutMember of
42、 B0endl;class B1:virtual public B0 /B0class B1:virtual public B0 /B0为虚基类,派生为虚基类,派生为虚基类,派生为虚基类,派生B1B1类类类类 public:public:/新增外部接口新增外部接口新增外部接口新增外部接口int nV1;int nV1;class B2:virtual public B0 /B0class B2:virtual public B0 /B0为虚基类,派生为虚基类,派生为虚基类,派生为虚基类,派生B2B2类类类类 public:public:/新增外部接口新增外部接口新增外部接口新增外部接口int
43、nV2;int nV2;现在学习的是第51页,共56页52class D1:public B1,public B2class D1:public B1,public B2/派生类派生类派生类派生类D1D1声明声明声明声明 public:public:/新增外部接口新增外部接口新增外部接口新增外部接口int nVd;int nVd;void fund()coutMember of D1endl;void fund()coutMember of D1endl;int main()int main()/程序主函数程序主函数程序主函数程序主函数 D1 d1;D1 d1;/声明声明声明声明D1D1类对象
44、类对象类对象类对象d1d1d1.nV=2;d1.nV=2;/使用最远基类成员使用最远基类成员使用最远基类成员使用最远基类成员d1.fun();d1.fun();现在学习的是第52页,共56页7.4.2 含有虚基类的派生类构造函数n建立对象时所指定的类称为最(远)派生类。建立对象时所指定的类称为最(远)派生类。n虚基类的成员是由最(远)派生类的构造函数通过调虚基类的成员是由最(远)派生类的构造函数通过调用虚基类的构造函数进行初始化的。用虚基类的构造函数进行初始化的。n在整个继承结构中,直接或间接继承虚基类的所在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中有派
45、生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。如果未列出,给出对虚基类的构造函数的调用。如果未列出,则表示调用该虚基类的默认构造函数。则表示调用该虚基类的默认构造函数。n在建立对象时,只有最(远)派生类的构造函数调用在建立对象时,只有最(远)派生类的构造函数调用虚基类的构造函数,该派生类的其他基类对虚基类构虚基类的构造函数,该派生类的其他基类对虚基类构造函数的调用被忽略。造函数的调用被忽略。现在学习的是第53页,共56页#include#include using namecpace std;using namecpace std;class B0class B0/声明基
46、类声明基类声明基类声明基类B0B0 public:public:/外部接口外部接口外部接口外部接口B0(int n)nV=n;B0(int n)nV=n;int nV;int nV;void fun()coutMember of B0endl;void fun()coutMember of B0endl;class B1:virtual public B0class B1:virtual public B0 public:public:B1(int a):B0(a)B1(int a):B0(a)int nV1;int nV1;class B2:virtual public B0class B2
47、:virtual public B0 public:public:B2(int a):B0(a)B2(int a):B0(a)int nV2;int nV2;例例现在学习的是第54页,共56页55class D1:public B1,public B2class D1:public B1,public B2 public:public:D1(int a):B0(a),B1(a),B2(a)D1(int a):B0(a),B1(a),B2(a)int nVd;int nVd;void fund()coutMember of D1endl;void fund()coutMember of D1endl;int main()int main()D1 d1(1);D1 d1(1);d1.nV=2;d1.nV=2;d1.fun();d1.fun();现在学习的是第55页,共56页小结n基类和派生类n派生类成员的访问权限 n派生类的构造函数和析构函数n子类型及赋值兼容规则n多重继承的二义性n虚基类现在学习的是第56页,共56页