1、e=e1int getB_d()return d; int getB_e()return e;2、根据下列代码,写出派生类B所含的成员及成员的访问控制属性 portected A3、根据下列代码,写出派生类Y所含的成员及成员的访问控制属性class BASE BASE() i=1; j=2; xtemp=3; void get_xtemp() get_ij(); cout(BASE)xtemp=xtempendl;protected: int i, j; void get_ij() cout(BASE)i=i(BASE)j=jprivate: int xtemp;class Y: public
2、 BASE Y() k=4; xtemp=5; void get_temp() cout(Y)i=(Y)j= cout (Y)k=kcout(Y)xtemp= get_ij(); double k; void get_xtemp() coutget_xtemp() in Y double xtemp; 4、根据下列代码,写出派生类Y所含的成员及成员的访问控制属性 protected BASE 5、根据下列代码,写出派生类B所含的成员及成员的访问控制属性class A int ax; int ay; int az; int Getax( )return ax; void Setax( int x
3、 ) ax = x;class B: public A int bx; int by; int bz; int Getbz( )return bz; void Setbz( int z )bz=z;6、根据下列代码,写出派生类B所含的成员及成员的访问控制属性 protected A三、填空题1、如果类继承了类,则类称为 (1) 类,而类称为 (2) 类。 (3) 类的对象可作为 (4) 类的对象处理,反过来不行,因为 (5) 。如果强制转换则要注意 (6) 。答案:(1)基类(2)派生类(3)派生类(4)基类(5)派生类有一些新成员(6)只能派生类强制转换为基类2、当用public继承从基类派
4、生一个类时,基类的public成员成为派生类的 (1) 成员,protected成员成为派生类的 (2) 成员,对private成员是 (3) 。公有派生可以使其类的 (4) ,所以公有派生是主流。(1)public成员(2)protected成员(3)不可访问(4)接口不变3、利用继承能够实现 (1) 。这种实现缩短了程序开发的时间,VC+中的 (2) 很好地体现了这一点。(1)代码的复用(2)MFC编程4、一个派生类只有一个直接基类的情况称为 (1) ,而有多个直接基类的情况称为(2) 。继承体现了类的 (3) 概念,这在MFC中得到了很好表现,MFC中只采用了 (4) 。(1)单继承/单
5、一继承(2)多继承/多重继承(3)层次(4)单继承/单一继承5、生成一个派生类对象时,先调用 (1) 的构造函数,然后调用 (2) 的构造函数。(1)基类/虚基类 (2)派生类6、继承发生在利用已有类派生新类时,其中 (1) 称为基类,或 (2) 类; (3) 称为派生类,或 (4) 类。(1)已有类 (2)父 (3)新类 (4)子7、在公有继承关系下,派生类的对象可以访问基类中的 (1) 成员,派生类的成员函数可以访问基类中的 (2) 成员。(1)公有/public (2)公有和保护/public and protected8、在保护继承关系下,基类的公有成员和保护成员将成为派生类中的 (1
6、) 成员,它们只能由派生类的 (2) 来访问;基类的私有成员将成为派生类中的 (3) 成员。(1)保护成员/protected (2)成员函数 (3)不可访问四、简答题1、构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。派生类构造函数各部分的执行次序是:1. 调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。2. 调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。3. 派生类的构造函数体中的操作。2、派生类的析构函数中需完成什么任务?是否要编写对基数和成员对象的析构函数的调用?为什么?析构函数的功能用于撤销该对
7、象时做清理工作,析构函数无返回类型也没有参数,情况比较简单。派生类析构函数定义格式与非派生类无任何差异,不要编写对基数和成员对象的析构函数的调用,只要在函数体内把派生类新增一般成员处理好就可以了,因为对新增的成员对象和基类的善后工作,系统会自己调用成员对象和基类的析构函数来完成。3、为什么要使用虚基类?怎样定义虚基类?在多重继承是有可能出现同一基类的两个拷贝,为避免这种情况,可使用虚基类。虚基类(virtual base class)定义方式如下:class 派生类名:virtual 访问限定符 基类类名.;访问限定符 virtual 基类类名.;4、比较类的三种继承方式public(公有继承
8、)、protected(保护继承)、private(私有继承)之间的差别。继承方式决定了基类中的成员在派生类中的属性。三种继承方式的共同点:基类的private成员在派生类中不可见。区别:对于私有继承,基类的public,protected成员在派生类中作为private成员;对于公有继承,基类的public,protected成员在派生类中访问属性不变;对于保护继承,基类的public,protected成员在派生类中作为protected成员。5、简单叙述派生类与基类的赋值兼容规则。凡是基类所能解决的问题,公有派生类都可以解决。在任何需要基类对象的地方都可以用公有派生类的对象来代替,这条规
9、则称赋值兼容规则。它包括以下情况:1 派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成员赋值给基类对象。反过来不行,因为派生类的新成员无值可赋。2 可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的成员,不能访问派生类中的新成员。同样也不能反过来做。派生类对象可以初始化基类的引用。引用是别名,但这个别名只能包含派生类对象中的由基类继承来的成员。6、什么是派生类与基类的赋值兼容规则?派生类与基类的赋值兼容规则:可以将公有派生类对象赋值给基类对象,反之是不允许的。五、阅读程序,分析类间关系及写出执行结果:1、写出下面程序的输出
10、#includeclass base int n; base(); base (int a) cout constructing base class endl; n=a;n= n base() cout destructing base classclass subs : public base int m; subs(int a, int b) : base(a)constructing sub class m=b; coutm= m subs()destructing sub classvoid main () subs s(1,2); 这里base 是基类,subs为派生类,subs类
11、的构造函数中含有调用基本类的构造函数。所以输出为: constructing base class n=1 constructing sub class n=2 destructing base class destructing sub class2、写出下面程序的输出#include A(int i) a=i;cout constructing class A void print() a A()destructing class Aclass Bi:public A int bl; Bl(int i,int j):A(i) bl=j;constructing class BI void
12、print() A:print (); bl BI() cout destructing class BIclass B2: int b2; B2(int i,int j):A(i); b2=j;constructing class B2 b2 B2() cout destructing class B2class C:public B1,public B2 int c; C(int i,int j,int k, int 1,int m) :Bl(i,j),B2(k,1),c(m)constructing class C Bl:print(); B2: c C( ) cout destruct
13、ing class Cvoid main() C c1(1,2,3,4,5); cl.print(); C类是从B1类和B2类派生的,而B1和B2类又都是从A类派生,但各有自己的副本,所有这些成员函数均有print()成员函数。所以,在C的成员函数实现中,调用print()时,要加上类作用域运算符“:”。constructing class Aconstructing class B1constructing class B2constructing class C12345destructing class Cdestructing class B2destructing class Ade
14、structing class B13、写出下面程序的输出 A(char *s) s A() B(char *sl,char *s2) :A(sl) s2 C(char *sl,char *s2) :class D:public B,public C D(char *sl,char *s2,char *s3,char *s4) :B(sl,s2),C(sl,s3) s4 D d(class A,class Bclass Cclass D); D类是从B和C类派生的,而B和C类又都是从A类派生,但各有自己的副本。class Bclass Cclass D4、写出下面程序的输出 A()coutnT
15、his is A class.n; B()coutThis is B class.nclass derivedA:public B,virtual public A public: derivedA()coutThis is derivedA class.nclass derivedB: public B,virtual public A derivedB()coutThis is derivedB class.nclass Derived: public derivedA, virtual public derivedB Derived()coutThis is Derived class.
16、n ;int main() Derived obj; return 1;derivedA类和derivedB类都是从虚基类A和基类B派生的,而Derived类又从derivedA类和虚基类derivedB派生,但各有自己的副本。This is A class.This is B class.This is derivedB class.This is derivedA class.This is Derived class.5、写出下面程序的输出class Base int i; Base(int n)cout Constucting base classi=n; Base()cout Destructing base class void showi()cout i int Geti()return i;public Base int j; Base aa; Derived(int n,int m,int p):Base(m),aa(p)Constructing derived class j=n; Derived()cout Destructing derived class void show()Base:showi(); j aa.Geti() Deri
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1