第7章继承和接口设计 习题.docx
《第7章继承和接口设计 习题.docx》由会员分享,可在线阅读,更多相关《第7章继承和接口设计 习题.docx(28页珍藏版)》请在冰豆网上搜索。
第7章继承和接口设计习题
第7章继承和接口设计
一.选择题
1.在C#中,一个类【】。
A)可以继承多个类B)可以实现多个接口
C)在一个程序中只能有一个子类D)只能实现一个接口
2.【】关键字用于在C#中从派生类中访问基类的成员。
A)newB)superC)thisD)base
3.在定义类时,若希望类的某个方法能够在派生类中进一步改进,以满足派生类的不同需要,则应将该方法声明为【】。
A)newB)publicC)virtualD)override
4.在C#中,在派生类中对基类的虚方法进行重写,要求在派生类的声明中使用【】。
A)newB)publicC)virtualD)override
5.已知类B是由类A继承而来,类A中有一个名为M的非虚方法,现在希望在类B中也定义一个名为M的方法,且两方法的参数个数和类型完全相同,若希望编译时不出现警告信息,则在类B中声明该方法时,应使用【】关键字。
A)staticB)newC)overrideD)virtual
6.假设类B继承了类A,下列说法错误的是【】。
A)类B中的成员可以访问类A中的公有成员
B)类B中的成员可以访问类A中的保护成员
C)类B中的成员可以访问类A中的私有成员
D)类B中的成员可以访问类A中的静态成员
7.关于多态,下列说法正确的是【】。
A)多态实际上就是重载,它们本质上是以一样的
B)多态可以分为编译时多态和运行时多态。
前者的特点是在编译时就能确定要调用成员方法的哪个版本,后者则是在程序运行时才能确定要调用成员方法的哪个版本。
C)编译时多态是在程序运行时才能确定要调用成员方法的哪个版本,而运行时多态在编译时就能确定要调用成员方法的哪个版本。
D)多态和重载是两个完全不同的概念,前者是通过定义虚方法和重写虚方法来实现,后者是通过对同一函数名编写多个不同的实现代码来实现。
8.下列关于接口的说法,正确的是【】。
A)接口中定义的方法都必须是虚方法
B)接口中定义的方法可以编写其实现代码
C)继承接口的类可提供被继承接口中部分成员的实现代码
D)接口中的所有方法都必须在其派生类中得到实现。
9.下列关于虚方法的描述中,正确的是【】。
A)虚方法能在程序执行时动态确定要调用的方法,因此比非虚方法更灵活
B)在定义虚方法时,基类和派生类的方法定义语句中都要带上virtual修饰符
C)在重写基类的虚方法时,为消除隐藏基类成员的警告,需要带上new修饰符
D)在重写基类的虚方法时,需要同时带上virtual和override修饰符
10.在C#中,以下关于抽象类的叙述中错误的是【】。
A)抽象类可以包含抽象方法B)含有抽象方法的类一定是抽象类
C)抽象类不能被实例化D)抽象类可以是密封类
11.在C#中,以下关于抽象类和接口的叙述中正确的是【】。
A)抽象类可以包含非抽象方法,而接口不包含任何方法的实现
B)抽象类可以被实例化,而接口不能被实例化
C)抽象类不能被实例化,而接口可以被实例化
D)抽象类能够被继承,而接口不能被继承
12.在C#中,以下关于抽象类和接口的叙述中正确的是【】。
A)在抽象类中,所有的方法都是抽象方法
B)继承自抽象类的子类必须实现其父类(抽象类)中的所有抽象方法
C)在接口的定义中可以有方法实现,在抽象类的定义中不能有方法实现
D)一个类可以从多个接口继承,也可以从多个抽象类继承
13.以下类和接口的区别中正确的是【】。
A)类可以继承而接口不可以B)类不可以继承而接口可以
C)类可以多继承而接口不可以D)类不可以多继承而接口可以
14.下列方法定义中,【】是抽象方法。
A)staticvoidfunc(){}B)virtualvoidfunc(){}
C)abstractvoidfunc(){}D)overridelvoidfunc(){}
15.下列关于接口的说法,错误的是【】。
A)一个类可以有多个基类和多个基接口B)抽象类和接口都不能被实例化
C)抽象类自身可以定义成员,而接口不可以D)类不可以多重继承,而接口可以。
16.已知类Base、Derived的定义如下:
classBase
{publicvoidHello()
{System.Console.Write(“HelloinBase!
”);}
}
classDerived:
Base
{publicnewvoidHello()
{System.Console.Write(“HelloinDerived!
”);}
}
则下列语句段在控制台中的输出结果是【】。
Derivedx=newDerived();
x.Hello();
A)HelloinBase!
B)HelloinBase!
HelloinDerived!
C)HelloinDerived!
D)HelloinDerived!
HelloinBase!
17.关于继承,下列说法正确的是【】。
A)子类将继承父类所有的成员B)子类将继承父类的非私有成员
C)子类只继承父类public成员D)子类只继承父类的方法,而不继承属性
18.下列是抽象类的声明的是【】。
A)abstractclassfigure{}B)classabstractfigure{}
C)sealdclassfigure{}D)staticclassfigure{}
19.abstract修饰的方法是抽象方法,抽象方法只有声明而无主体,且【】。
A)只能存在于抽象类中B)可以在任何类中
C)只能在接口中D)只能在密封类中
20.重写一个基类的虚方法时,应与原虚方法的方法名相同,并且【】。
A)不能改变方法的参数类型、个数和返回值
B)可以改变方法的参数类型、个数和返回值
C)可以改变方法的返回值
D)可以改变方法的参数类型和个数
21.下面有关继承的说法中,正确的是【】。
A)A类和B类均有C类需要的成员,因此可以从A类和B类共同派生出C类
B)在派生新类时,可以指明是公有派生、私有派生或保护派生
C)派生类可以继承基类中的成员,同时也继承基类的父类中的成员
D)在派生类中,不能添加新的成员,只能继承基类的成员
22.为了防止从所修饰的类派生出其他类,可以将此类定义为【】。
A)抽象类B)密封类C)静态类D)私有类
23.若想从派生类中访问基类的成员,可以使用【】。
A)this关键字B)me关键字C)base关键字D)override关键字
24.下面有关派生类的描述中,不正确的是【】。
A)派生类可以继承基类的构造函数B)派生类可以隐藏和重载基类的成员
C)派生类不能访问基类的私有成员D)派生类只能有一个直接基类
25.C#中的多态不能通过【】实现。
A)接口B)抽象类C)密封类D)虚方法
26.下列程序错误的原因是【】。
sealedclassSealedClass{}
classDerived:
SealedClass{}
A)SealedClass类不能被继承B)没有Main()入口
C)SealedClass没有被实例化D)以上皆是
27.下面关于接口的叙述中,不正确的是【】。
A)接口只是由方法、属性、索引器或事件组成的框架,并没有描述任何对象的实例代码
B)接口的所有成员都被自动定义为公有的,不可使用访问修饰符来定义接口成员
C)类可以通过在类型定义语句中包括冒号和接口名来表明它正在实现接口
D)一个类只能实现一个接口
28.接口可以包含一个或多个成员,以下选项中【】不能包含在接口中。
A)方法B)属性C)事件D)常量
29.下列叙述中,正确的是【】。
A)接口中可以有虚方法B)一个类可以实现多个接口
C)接口能被实例化D)接口中可以包含已实现的方法
30.关于虚方法实现多态,下列说法错误的是【】。
A)定义虚方法使用关键字virtualB)关键字virtual可以与override一起使用
C)虚方法是实现多态的一种应用形式D)派生类是实现多态的一种应用形式
31.以下类MyClass的定义中,【】是合法的抽象类。
A)abstractclassMyClass{publicabstractintgetCount();}
B)abstractclassMyClass{publicvirtualabstractintgetCount();}
C)abstractclassMyClass{privateabstractintgetCount();}
D)abstractclassMyClass{publicstaticabstractintgetCount();}
32.分析下列程序中类MyClass的定义
classBaseClass
{publicinti;}
classMyClass:
BaseClass
{publicnewinti;}
则下列语句在Console上的输出为【】。
MyClassy=newMyClass();
BaseClassx=y;
x.i=100;
Console.WriteLine("{0},{1}",x.i,y.i);
A)0,0B)100,100C)0,100D)100,0
33.在C#程序中定义如下IPlay接口,实现此接口代码正确的是【】。
interfaceIPlay
{voidPlay();
voidShow();
}
A)classTeacher:
Iplay
{voidPlay(){//省略部分代码}
voidShow0{//省略部分代码}
B)classTeacher:
Iplay
{publicstringPlay(){//省略部分代码}
publicvoidShow0{//省略部分代码}
C)classTeacher:
Iplay
{publicvoidPlay(){//省略部分代码}
publicvoidShow0{//省略部分代码}
D)classTeacher:
Iplay
{publicvoidPlay();
publicvoidShow0{//省略部分代码}
34.以下泛型集合声明中正确的是【】。
A)Listf=newList();B)Listf=newList();
C)Listf=newList();D)Listf=newList;
34.以下关于泛型的叙述中错误的是【】。
A)泛型是通过参数化类型来实现在同一份代码上操作多种数据类型
B)泛型编程是一种编程范式,其特点是参数化类型,
C)泛型类型和普通类型的区别在于泛型类型与一组类型参数或类型变量关联
D)以上都不对
二.填空题
1.在C#中有两种多态性:
编译时的多态性和运行时的多态性。
编译时的多态性是通过【虚方法和重写虚方法】实现的,运行时的多态性是通过继承和【重载/隐藏】来实现的。
2.在声明类时,在类名前使用【abstract】修饰符,则声明的类只能作为其他类的基类,不能被实例化。
3.在声明类时,在类名前使用【sealed】修饰符,则声明的类不能作为其他类的基类,不能再派生新的类。
4.下列程序的运行结果是【AB】。
考察类的继承(构造函数是先基类的先构造,析构函数是子类先析构)
classA
{publicA()
{Console.WriteLine("A");}
}
classB:
A
{publicB()
{Console.WriteLine("B");}
}
classProgram
{publicstaticvoidMain()
{Bb=newB();
Console.ReadLine();
}
}
5.分析下列程序的运行结果是【】。
考察类的继承中base的使用
classA
{publicintx=100;}
classB:
A
{newpublicintx;
publicB(inty,intz){x=y;base.x=z;}
publicintgetx1(){returnbase.x;}
publicintgetx2(){returnx;}
}
classProgram
{publicstaticvoidMain()
{Bb=newB(3,6);
intn=b.getx1();
intm=b.getx2();
Console.WriteLine("m={0},n={1}",m,n);
}
}
m=3,n=6
6.分析下列程序的运行结果是【】。
考察类的继承(隐藏和重写)
abstractclassBaseClass
{publicvoidMethodA()
{Console.WriteLine("BaseClass.MethodA");}
publicvirtualvoidMethodB()
{Console.WriteLine("BaseClass.MethodB");}
}
classClass1:
BaseClass
{newpublicvoidMethodA()
{Console.WriteLine("Class1.MethodA");}
publicoverridevoidMethodB()
{Console.WriteLine("Class1.MethodB");}
}
classClass2:
Class1
{newpublicvoidMethodB()
{Console.WriteLine("Class2.MethodB");}
}
classMainClass
{publicstaticvoidMain(string[]args)
{Class2a=newClass2();
a.MethodA();a.MethodB();
Console.Read();
}
}
Class1.MethodA
Class2.MethodB
7.下列程序的运行结果是【AACCDDDD】。
考察类的继承(隐藏和重写)
classA
{publicvoidF1(){Console.Write("AA");}
publicvirtualvoidF2(){Console.Write("BB");}
}
classB:
A
{newpublicvoidF1(){Console.Write("CC");}
publicoverridevoidF2(){Console.Write("DD");}
}
classTest
{staticvoidMain()
{Bb=newB();
Aa=b;
a.F1();b.F1();a.F2();b.F2();
Console.Read();
}
}
8.阅读下列程序,程序的输出结果是【】。
考察类的继承
publicclassA
{privateintspeed=10;
publicintSpeed
{get{returnspeed;}
set{speed=value;Console.WriteLine("禁止驶入!
");}
}
}
publicclassB:
A
{publicB()
{if(this.Speed>=20)Console.Write("机动车");
elseConsole.Write("非机动车");
}
}
classProgram
{publicstaticvoidMain()
{Bb=newB();
b.Speed=30;
}
}
非机动车禁止驶入!
9.阅读下列程序,程序的输出结果是【】。
考察类的继承
publicclassPerson
{privateintage=0;
publicintAge
{get
{returnage;}
set
{if(value>=18)Console.Write("成年人");
elseConsole.Write("未成年人");
age=value;
}
}
}
publicclassPeople:
Person
{publicPeople(intage)
{Age=age;
Console.WriteLine("不得入内");
}
}
classProgram
{publicstaticvoidMain()
{Peopleb=newPeople(25);
Console.WriteLine("你的年龄是:
{0}",b.Age);
Console.Read();
}
}
成年人不得入内
你的年龄是:
25
10.阅读下列程序,程序的输出结果是【】。
考察接口的映射
interfaceIA
{voidHello();}
classBase:
IA
{publicvoidHello()
{Console.WriteLine("HelloinBase!
");}
}
classDerived:
Base
{newpublicvoidHello()
{Console.WriteLine("HelloinDerived!
");}
}
classProgram
{publicstaticvoidMain()
{Baseb=newBase();
Derivedd=newDerived();
IAx;
b.Hello();d.Hello();
x=b;x.Hello();
x=d;x.Hello();
Console.Read();
}
}
HelloinBase!
HelloinDerived!
HelloinBase!
HelloinBase!
11.阅读下列程序,程序的输出结果是【】。
考察接口的映射
interfaceIA
{voidHello();}
classBase:
IA
{publicvoidHello()
{Console.WriteLine("HelloinBase!
");}
}
classDerived:
IA
{newpublicvoidHello()
{Console.WriteLine("HelloinDerived!
");}
}
classProgram
{publicstaticvoidMain()
{Baseb=newBase();
Derivedd=newDerived();
IAx;
x=b;x.Hello();
x=d;x.Hello();
Console.Read();
}
}
HelloinBase!
HelloinDerived!
12.阅读下列程序,程序的输出结果是【】。
考察接口的映射
interfaceIa//接口Ia声明
{doublefun1();//接口成员声明
intfun2();//接口成员声明
}
classA//声明基类A
{publicintfun2() //隐式实现接口成员fun2
{return2;}
}
classB:
A,Ia//类B从基类A和接口继承
{doublex;
publicB(doubley)//构造函数
{x=y;}
publicdoublefun1()//隐式实现接口成员fun1
{returnx;}
}
classProgram
{staticvoidMain(string[]args)
{Bb=newB(2.5);
Console.WriteLine("{0}",b.fun1());
Console.WriteLine("{0}",b.fun2());
Console.Read();
}
}
2.5
2
12.阅读下列程序,程序的输出结果是【】。
考察类的实现与泛型
classStack//声明栈泛型类
{intmaxsize;//栈中元素最多个数
T[]data;//存放栈中T类型的元素
inttop;//栈顶指针
publicStack()//构造函数
{maxsize=10;data=newT[maxsize];
top=-1;
}
publicStack(intn)//重载构造函数
{maxsize=n;data=newT[maxsize];
top=-1;
}
publicboolStackEmpty()//判断栈空方法
{returntop==-1;}
publicboolPush(Te)//元素e进栈方法
{if(top==maxsize-1)