1、虚基类的构造函数,派生类中子对象类的构造函数,派生类自己的构造函数。例题5:C+类体系中,能被派生类继承的是()。A构造函数B虚函数C析构函数D友元函数C+类体系中,构造函数、析构函数和友元函数是不能被派生类继承的例题6:设有基类定义:class Cbaseprivate: int a;protected: int b;public: int c;派生类采用何种继承方式可以使成员变量b成为自己的私有成员()A.私有继承B.保护继承C.公有继承D.私有、保护、公有均可私有继承时,基类的protected成员在派生类中作为private成员。例题7:C+将类继承分为()和()两种。()单继承()多
2、继承派生类可以只从一个基类中派生,也可以从多个基类中派生。从一个基类中派生的继承方式称为单继承。从多个基类中派生的继承方式称为多继承。例题8:派生类可以定义其_中不具备的数据和操作。基类派生类是从基类派生的,派生类包含了它所有基类的除构造函数、析构函数之外的所有成员,同时还拥有它自己的新成员。例题9:派生类构造函数的初始化列表中包含_。初始化基类数据成员、新增内嵌对象数据及新增一般成员数据所需要的全部参数。例题10:在继承机制下,当对象消亡时,编译系统先执行(1)的析构函数,然后才执行(2)的析构函数,最后执行(3)的析构函数。(1)派生类(2)派生类中子对象类(3)基类派生类的析构函数的执行
3、次序与构造函数正好相反,先调用派生类的析构函数,再调用派生类中子对象类的析构函数,最后调用基类的析构函数。例题11:设有以下类的定义:class Aclass B: protected Aclass C: private BintA1;int b1;int c1;int A2; int b2; int c2;int A3; int b3; int c3;请按访问权限写出派生类C中具有的成员。私有成员:保护成员:公有成员:。(1)c1、b2、b3、A2、A3(2)c2(3)c3类有它自己的私有成员b1、保护成员b2和公有成员有b3,另外类是以保护方式从类中派生出来的,所以类保护成员2和公有成员A
4、3在类中都变成保护类型的;类有自己的私有成员c1、保护成员c2和公有成员有c3,类是以私有方式从B类中派生出来的,所以类中的b2、b3、A2和A3在类中都变成私有的访问方式。例题12:指出并改正下面程序中的错误。#includeclass Pointint x,y;Point(int a=0,int b=0) x=a; y=b;void move(int xoffset,int yoffset) x+=xoffset; y+=yoffset;int getx() return x;int gety() return y;class Rectangle:protected Pointint le
5、ngth,width;Rectangle(int x,int y,int l,int w):Point(x,y)length=l;width=w;int getlength()return length;int getwidth()return width;void main() Rectangle r(0,0,8,4);r.move(23,56);coutr.getx(),r.gety()r.getlength()r.getwidth()endl;保护继承方式使基类的public成员在派生类中的访问属性变为protected,所以派生类Rectangle的对象r不能直接访问基类的成员函数mo
6、ve()、getx()和gety()。其改正方法有两种:1)将Rectangle的继承方式改为公有继承public;2)在Rectangle类中重定义move(),getx()和gety()函数,覆盖基类的同名函数。void Rectangle:move(int xoffset,int yoffset)Point:move(xoffset,yoffset);getx()return Point:getx();gety()return Point:gety();例题13:class A public:int x;A(int a=0) x=a;void display() coutA.x=x cl
7、ass BB(int a=0) x=a;void display() coutB.x=public A,public Bint y;C(int a,int b,int c) :A(a),B(b)y=c;int gety() return y; C myc(1,2,3);myc.x=10;myc.display();类A、B中有同名公有数据成员x和同名成员函数display(),在主函数中访问对象myc的数据成员x是无法确定是访问从A中继承的还是从B中继承的x;调用成员函数也是如此,无法确认是调用类A中的还是类B中的,产生二义性。改正方法,可以用作用域区分符加以限定,如改成myc.A:x=10;
8、 myc.A:display();或myc.B: myc.B:display();例题14:看程序写结果#include class Baseint i;Base(int n)cout Constucting base class endl;i=n;Base()cout Destructing base classvoid showi()cout i ;int Geti()return i;class Derived:public Baseint j;Base aa;Derived(int n,int m,int p):Base(m),aa(p)cout Constructing derive
9、d classj=n;Derived()cout Destructing derived classvoid show()Base:showi(); j aa.Geti() Derived obj(8,13,24);obj.show();说明:派生类的构造函数的执行次序,先调用基类的构造函数,再调用派生类中子对象类的构造函数,最后调用派生类的构造函数。析构函数的执行次序与构造函数正好相反,先调用派生类的析构函数,再调用派生类中子对象类的析构函数,最后调用基类的析构函数。运行结果:Constucting base classConstructing derived class13,8,24Destructing derived classDestructing base class93 教材习题分析与解答1选择题(1)C+中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过()派生了新的类。A.复用B.继承C.封装D.引用B(2)继承具有(),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。A)规律性B.传递性C.重复性D.多样性(3)下列对基类和派生类关系的描述中,错误的是(A.派生类是基类的具体化B.派生类是基类的子集C.派生类是基类
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1