继承与多态习题

合集下载

Java程序设计(继承与多态)期末单元测试与答案

Java程序设计(继承与多态)期末单元测试与答案

一、单选题1、Java语言中,所创建的子类都应有一个()。

A.派生类B.子类C.抽象类D.父类正确答案:D2、如果子类构造器中没有super()出现,那么编译器则会默认加上()构造器。

A.super()B.superC.thisD.this()正确答案:A3、Java中构造方法super()的使用,下列不正确的是()。

A.直接引用B.调用子类的构造函数C.引用父类成员D.调用父类的构造函数正确答案:B4、下列说法不正确的是()。

A.在同一个类中定义的重载方法可以互相调用B.构造方法允许重载C.子类无条件的调用父类无参构造方法D.子类不允许调用父类的构造方法正确答案:D5、代码如下:Employee man = new Manager(); man.test();上述代码是()的实现。

A.方法调用B.方法重写C.对象引用D.方法重载正确答案:A6、对成员的访问控制保护最强的是()。

A.缺省B.privateC.publicD.protected正确答案:B7、下列对封装性的描述中,错误的是()。

A.封装体中的属性和行为的访问权限是相同的B.封装使得抽象的数据类型提高了可重用性C.封装体包含了属性和行为D.被封装的某些信息在封装体外是不可见的正确答案:A8、在类的修饰符中,规定只能被同一包类所使用的修饰符是()。

A.abstractB.finalC.publicD.默认正确答案:D9、在Java语言中,类方法(静态方法)可以被继承,但是不能被()。

A.重载B.继承C.重写D.重构正确答案:C10、Java中,哪种是不可以用来限制存取权限的关键字()。

A.extendsB.protectedC.publicD.private正确答案:A11、不允许作为类及类成员的访问控制符的是()。

A.protectedB.staticC.privateD.public正确答案:B12、在Java中,能使派生类的功能可以被基类的方法或引用变量所调用,向后兼容,这种方法叫做()。

第七章继承多态练习题

第七章继承多态练习题

第七章继承多态一、选择题:1、分析:class A {A() { }}class B extends A { //系统自动生成的构造方法和类的访问权限一样}哪两种说法是正确的? ( )A:类B的构造方法是public的. B:类B的构造方法包含对this()的调用. C:类B的构造方法没有参数. D:类B的构造方法包含对super()的调用.2、运行结果是:()class Base {Base() { System.out.print("Base"); }}public class Alpha extends Base {public static void main( String[] args ) {new Alpha();new Base();}}A: Base B: BaseBase C: 编译失败. D: 没有输出. E: 运行时异常. 3. 程序的运行结果是?()A: 编译失败. B: hello from a C: hello from bD: hello from b E: hello from ahello from a hello from b4. 运行结果是:()class TestSuper {TestSuper(int i) { }}class TestSub extends TestSuper{ }class TestAll {public static void main (String [] args) {new TestSub();}}A: 编译失败. B: 程序运行没有异常.C: 第7行抛出异常. D: 第2行抛出异常.5. 程序的运行结果是?()A: 0 B: 1 C: 2 D: 编译失败.6. 对于语句"B is a D" 和"B has a C",一下哪两种说法是正确的? ( ) A:D是B. B:B是D. C:D是C. D:B是C. E:D继承B.F:B 继承D.7. 运行结果是?()A: 1 B: 2 C: 第8行编译失败. D: 第14行编译失败.8. 分析:public class ConstOver {public ConstOver(int x, int y, int z) {}}哪两个是对ConstOver 的构造方法的重载? ( )A:ConstOver() { } B:protected int ConstOver() { }C:private ConstOver(int z, int y, byte x) { }D:public Object ConstOver(int x, int y, int z) { }E:public void ConstOver(byte x, byte y, byte z) { }9. 运行结果是?()A: 4,4 B: 4,5 C: 5,4 D: 5,5 E: 编译失败.10. 分析:public class X {public X aMethod() { return this;}}1) public class Y extends X {2)3) }在第2行可以插入哪两项? ( )A:public void aMethod() { } B:private void aMethod() { }C:public void aMethod(String s) { } D:private Y aMethod() { return null; } E:public X aMethod() { return new Y(); }11. 运行结果是?()A: 4,4 B: 4,5 C: 5,4 D: 5,5 E: 编译失败.12. 以下哪两个重载了方法setVar()? ( )public class MethodOver {public void setVar(int a, int b, float c) {}}A:private void setVar(int a, float c, int b) { } B:public int setVar(int a, float c, int b) {return a;}C:protected void setVar(int a, int b, float c) { } D:public int setVar(int a, int b, float c) {return a;}E:protected float setVar(int a, int b, float c) {return c;}13. 分析:1) class BaseClass {2) private float x = 1.0f;3) protected void setVar(float f) { x = f; }4) }5) class SubClass extends BaseClass {6) private float x = 2.0f;7) // insert code here8) }在第7行插入哪两个覆盖了方法setVar()? ( )A:void setVar(float f) { x = f; } B:public void setVar(int f) { x = f; } C:public void setVar(float f) { x = f; } D:public double setVar(float f){ return f; }E:public final void setVar(float f) { x = f; } F:protected float setVar() { x = 3.0f; return 3.0f; }14. 运行结果是?( )A: 1 B: 2 C: 运行时异常. D: 第8行编译错误. E: 第14行编译错误.15. 分析:class A {protected int method1(int a, int b) { return 0; }}在A的子类中,以下哪两个方法是合法的? ( )A:public int method1(int a, int b) { return 0; } B:private int method1(int a, long b) { return 0; }C:private int method1(int a, int b) { return 0; } D:public short method1(int a, int b) { return 0; }E:static protected int method1(int a, int b) { return 0; }16. 分析:1) public abstract class Test {2) public abstract void methodA();3)4) public abstract void methodB()5) {6) System.out.println("Hello");7) }8) }哪两种改法,可以使程序通过编译? ( )A:给方法methodA()加方法体C:在Test的声明中去掉abstractB:用";"替换第5-7行D:在方法methodA()的声明中去掉abstract E: 在方法methodB()的声明中去掉abstract17. 运行结果是:()1) abstract class AbstractIt {2) abstract float getFloat();3) }4) public class AbstractTest extends AbstractIt {5) private float f1 = 1.0f;6) private float getFloat() { return f1; }7) }A: 编译成功. B: 运行时异常. C: 第2行编译失败. D: 第6行编译失败.18. 在接口中哪两个方法的声明是合法的? ( )A:void method1(); B:public void method2(); C:static public void method5();D:protected void method3(); E:final public void method4();19. 分析:1) public interface Foo {2) int k = 4;3) }哪三项与第2行等价? ( )A:final int k = 4; B:public int k = 4; C:static int k = 4;D:abstract int k = 4; E:volatile int k = 4; F:protected int k = 4;20. 分析:interface Inter { }class A implements Inter { }class B extends A {B() {A[] arr = new A[10];boolean b1 = this instanceof Inter;boolean b2 = arr instanceof Object;System.out.println("b1 = " + b1 + ", b2 = " + b2);}}创建B的对象时会输出?( )A: 编译失败. B: b1 = true, b2 = true C: b1 = true, b2 = falseD: b1 = false, b2 = true E: b1 = false, b2 = false21. 哪一个能通过编译?()A: new Animal().soundOff(); B: Lion l = Alpha1.get("meat eater");C: Elephant e = new Alpha1(); D: new Alpha1().get("veggie").soundOff();22. 分析:class Passenger { }class Engine { }interface TransportVehicle {void loadPassengers();}interface Helicopter extends TransportVehicle {int flyIt( String direction );}abstract class JetStream implements Helicopter { }哪种说法是正确的?()A: TransportVehicle has a Passenger. B: 类Engine在类JetStream中.C: 接口TransportVehicle可以形成多态的基础.D: 继承JetStream的非抽象类可以随意声明方法loadPassengers().23. 哪三个是"is a" 关系? ( )A:public class X { } B:public interface Shape { }public class Y extends X { } public interface Rectangle extends Shape{ }C:public interface Color { } D:public class Species { }public class Shape { private Color color; } public class Animal { private Species species; }E:public class Person { } F:interface Component { }public class Employee { class Container implementsComponent {public Employee(Person person) { } private Component[] children;} }24. 运行结果是:()public interface Test {int frood = 42;}class TestImpl implements Test {private static int frood;public static void main(String[] args) {System.out.println(++frood);}}A: 0 B: 1 C: 42 D: 43 E: 编译失败. F: 运行时异常.25. 运行结果是?()A: 5 B: 10 C: 编译失败. D: 运行时异常.26. 运行结果是:()1) public class Test {2) public static void main(String args[]) {3) class Foo {4) public int i = 3;5) }6) Object o = (Object)new Foo();7) Foo foo = (Foo)o;8) System.out.println("i = " + foo.i);9) }10) }A: i = 3 C: 第6行抛出ClassCastException异常.B: 编译失败. D: 第7行抛出ClassCastException异常.27. 分析:String s = "abcde";Object ob = (Object)s;if (ob.equals(s)) {System.out.println("AAAA");} else {System.out.println("BBBB");}if (s.equals(ob)) {System.out.println("CCCC");} else {System.out.println("DDDD");}输出哪两行? ( )A:AAAA B:BBBB C:CCCC D:DDDD二、简答题1. 简述类与类之间的关系2. 简述继承的基本概念及继承的过程3. 简述方法重写以及方法重载与方法重写的区别4. 简述super关键字的用法5. 简述重写equals方法的步骤6. 简述instanceof关键字的用法7. 简述接口和抽象类的区别8. 简述什么是多态三、编程题1. 设计一个学生类Student,包括的属性有姓名name,年龄age,学位degree。

C++习题3(继承和多态)

C++习题3(继承和多态)

C++习题3(继承和多态)C++习题3(继承和多态)一、选择题1、在C++中,类与类之间的继承关系具有( C )A)自反性 B)对称性 C)传递性 D)反对称性2、在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( B )A)受限制 B)保持不变 C)受保护 D)不受保护3、按解释中的要求在下列程序划线处填入的正确语句是:( C )#include class Base{public:void fun(){cout<<"Base::fun"<<=""> fun()cout<<"Derived::fun"<fun();4、在保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( C )A)受限制 B)保持不变 C)受保护 D)不受保护5、在哪种派生方式中,派生类可以访问基类中的protected 成员(B )A)public和private B)public、protected和private C)protected和private D)仅protected6、当一个派生类仅有protected继承一个基类时,基类中的所有公有成员成为派生类的(C)A)public成员 B)private成员 C)protected成员 D)友元7、不论派生类以何种方法继承基类,都不能使用基类的(B )A)public成员 B)private成员 C)protected成员 D)public成员和protected成员8下面叙述错误的是(S )。

A )基类的protected成员在派生类中仍然是protected的 B)基类的protected成员在public派生类中仍然是protected的C)基类的protected成员在private派生类中是private的 D)基类的protected 成员不能被派生类的对象访问9、下列说法中错误的是(S )。

C++习题3(继承和多态)

C++习题3(继承和多态)

习题3一、选择题1.在C++中,类与类之间的继承关系具有( C )A)自反性B)对称性C)传递性D)反对称性2.在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( B )A)受限制B)保持不变C)受保护D)不受保护3.按解释中的要求在下列程序划线处填入的正确语句是:( C )#include <iostream.h>class Base{public:void fun(){cout<<"Base::fun"<<endl;}};class Derived:public Base{public:void fun(){ //在此空格处调用基类的函数fun()cout<<"Derived::fun"<<endl;}};A)fun();B)Base.fun();C)Base::fun();D)Base->fun();4.在保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限(C )页脚内容1A)受限制B)保持不变C)受保护D)不受保护5.在哪种派生方式中,派生类可以访问基类中的protected成员(B )A)public和private B)public、protected和privateC)protected和private D)仅protected6.当一个派生类仅有protected继承一个基类时,基类中的所有公有成员成为派生类的(C)A) public成员B) private成员C) protected成员D) 友元7.不论派生类以何种方法继承基类,都不能使用基类的(B )A) public成员B) private成员C) protected成员D) public成员和protected成员8下面叙述错误的是(S )。

A)基类的protected成员在派生类中仍然是protected的B)基类的protected成员在public派生类中仍然是protected的C)基类的protected成员在private派生类中是private的D)基类的protected成员不能被派生类的对象访问9.下列说法中错误的是(S )。

Java题库——Chapter11继承和多态

Java题库——Chapter11继承和多态

Java题库——Chapter11继承和多态1)Analyze the following code:public class Test {public static void main(String[ ] args) {B b = new B();b.m(5);System.out.println("i is " + b.i);}}class A {int i;public void m(int i) {this.i = i;}}class B extends A {public void m(String s) {}}A)The program has a compilation error, because m is overridden with a different signature in B.B)The method m is not overridden in B. B inherits the method m from A and defines an overloaded method m in B.C)The program has a runtime error on b.i, because i is not accessible from b.D)The program has a compilation error, because b.m(5) cannot be invoked since the method m(int) is hidden in B. B中没有重写⽅法m。

B继承了A中的⽅法m,并在B中定义了⼀个重载的⽅法m。

2)Analyze the following code.// Program 1public class Test {public static void main(String[ ] args) {Object a1 = new A();Object a2 = new A();System.out.println(((A)a1).equals((A)a2));}}class A {int x;public boolean equals(A a) {return this.x == a.x;}}// Program 2public class Test {public static void main(String[ ] args) {A a1 = new A();A a2 = new A();System.out.println(a1.equals(a2));}}class A {int x;public boolean equals(A a) {return this.x == a.x;}}A)Program 1 displays true and Program 2 displays trueB)Program 1 displays false and Program 2 displays trueC)Program 1 displays false and Program 2 displays falseD)Program 1 displays true and Program 2 displays false3)Invoking ________ removes all elements in an ArrayList x. 3) _______A)x.clear() B)x.delete() C)x.remove() D)x.empty() E)x.clean()4)Analyze the following code:Cylinder cy = new Cylinder(1, 1);Circle c = cy; 4) _______A)The code has a runtime error. B)The code has a compile error. C)The code is fine.5)Which of the following statements are true? (Choose all that apply.) 5) _______A)Overloading a method is to provide more than one method with the same name but with different signatures to distinguish them.B)A private method cannot be overridden. If a method defined in a subclass is private in its superclass, the two methods are completely unrelated.C)It is a compilation error if two methods differ only in return type in the same class.D)A static method cannot be overridden. If a static method defined in the superclass is redefined in a subclass, the method defined in the superclass is hidden.E)To override a method, the method must be defined in the subclass using the same signature and compatible return type as in its superclass.1、重载⼀个⽅法是提供多个具有相同名称但具有不同签名的⽅法来区分它们。

继承与多态习题

继承与多态习题

继承与多态习题继承与多态习题⼀.基本概念与基础知识⾃测题8.1填空题8.1.1 如果类α继承了类β,则类α称为(1)类,⽽类β称为(2)类。

(3)类的对象可作为(4)类的对象处理,反过来不⾏,因为(5)。

如果强制转换则要注意(6)。

答案:(1)基类(2)派⽣类(3)派⽣类(4)基类(5)派⽣类有⼀些新成员(6)只能派⽣类强制转换为基类8.1.2 当⽤public继承从基类派⽣⼀个类时,基类的public成员成为派⽣类的(1)成员,protected成员成为派⽣类的(2)成员,对private成员是(3)。

公有派⽣可以使其类的(4),所以公有派⽣是主流。

答案:(1)public成员(2)protected成员(3)不可访问(4)接⼝不变8.1.3 利⽤继承能够实现(1)。

这种实现缩短了程序开发的时间,VC++中的(2)很好地体现了这⼀点。

答案:(1)代码的复⽤(2)MFC编程8.1.4 ⼀个派⽣类只有⼀个直接基类的情况称为(1),⽽有多个直接基类的情况称为(2)。

继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采⽤了(4)。

答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.5 C++中多态性包括两种多态性:(1)和(2)。

前者是通过(3)实现的,⽽后者是通过(4)和(5)来实现的。

答案:(1)编译时的(2)运⾏时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.1.6 在基类中将⼀个成员函数说明成虚函数后,在其派⽣类中只要(1)、(2)和(3)完全⼀样就认为是虚函数,⽽不必再加关键字(4)。

如有任何不同,则认为是(5)⽽不是虚函数。

除了⾮成员函数不能作为虚函数外,(6)、(7)和(8)也不能作为虚函数。

答案:(1)同虚函数名(2)同参数表(3)同返回类型。

如基类中返回基类指针,⽽派⽣类中返回派⽣类指针是允许的(4)virtual(5)重载(6)静态成员函数(7)内联函数(8)构造函数8.1.7 纯虚函数定义时在函数参数表后加(1),它表明程序员对函数(2),其本质是将指向函数体的指针定为(3)。

多态与继承作业

多态与继承作业

1、请编码实现如下需求:(1)动物(Animal)分为:兔子(Rabbit)、老虎(Tigger)。

其中动物类(Animal)为抽象出来动物父类,有表示动物的重量weight、颜色color;动物的吃(eat())、睡(sleep())及抽象动物的游泳(swim())行为;以及相应的构造方法。

(2)兔子类(Rabbit)有一个特殊属性年龄age,特有的吃、睡行为;老虎类(Tigger)的特殊属性性别tiggerSex,特有的吃、睡及游泳行为。

(3)编写一个测试类AnimalTest,要求:对各种动物进行测试。

要依据不同的不同,进行相应的各种行为的测试。

(4)用UML工具,画出上述类的类图及类与类之间的关系。

class Animal {double weight;String color;Animal(double weight , String color) {this.weight = weight;this.color = color;}public String eat() {return "Eating...";}public String sleep() {return "Sleep...";}public String swim() {return "Swim...";}public String info(){return ("weight=" + weight + ",color=" + color );}}class Rabbit extends Animal{int age ;Rabbit(int age) {super(8,"白色");this.age = age;}public String eat() {return "Eating Radish.. ";}public String sleep() {return " Rabbit Sleep...";}public String swim() {return "Rabbit Swim...";}public String info(){return (()+ ",age=" + age);}}class Tigger extends Animal {String tiggerSex;Tigger(String tiggerSex) {super(88,"黄色");this.tiggerSex = tiggerSex;}public String eat() {return "Eating Meat... ";}public String sleep() {return " Tigger Sleep...";}public String swim() {return "Tigger Swim...";}public String info(){return (() + ",tiggerSex=" + tiggerSex );}}public class TestAnimal {public static void main(String [] args) {Rabbit rabbit = new Rabbit(9);Tigger tigger = new Tigger("男");/*rabbit.weight = 8;rabbit.color = "白色";tigger.weight = 88;tigger.color = "黄色";*/System.out.println(());System.out.println("rabbit.eat=" + rabbit.eat());System.out.println("rabbit.sleep=" + rabbit.sleep());System.out.println("rabbit.swim=" + rabbit.swim());System.out.println("==========================");System.out.println(());System.out.println("tigger.eat=" + tigger.eat());System.out.println("tigger.sleep=" + tigger.sleep());System.out.println("tigger.swim=" + tigger.swim());}}2、请编码实现如下需求:(1)乐器(Instrument)分为:钢琴(Piano)、小提琴(Violin)。

第8章 继承与多态性习题参考答案

第8章 继承与多态性习题参考答案

C++程序设计语言习题及实验指导第8章继承与多态性习题参考答案8.3 习题8.3.1 选择题8.3.2 填空题1.(1) a、b、c、x、y、z (2) b、y (3) c、z (4) a、x (5) b、c、x、y、z(6) b、y (7) y (8) b、c、z (9) a、x (10) b、c、x、y、z (11) y(12) y (13) z (14) a、b、c、x (15) b、c、x、y、z (16) y 2.私有3.抽象4.虚基5.(1) 基类(2) 对象6.(1) 静态(2) 编译(3) 虚函数7.(1) 2 1 (2) 0 58.(1) 100 200 300 30 (2) 10 100 (3) 20 200 9.(1) 5 10 (2) end. (3) 20 1010.(1) classA classB (2) end. (3) ~classB ~classA 11.(1) 10 (2) build B (3) build C (4) release A12.(1) class B (2) class C (3) class D (4) 513.(1) 5 5 (2) 20 2014.(1) 10 (2) 10 2015.(1) 1 (2) 3 (3) 5 (4) 100 1016.(1) B::f() (2) B::fun() (3) A::f() (4) B::fun()17.(1) 姓名陈涛年薪6.8万元。

(2) 姓名李原(3) 姓名李原月工资4000元18.(1) 110 (2) 222019.(1) protected 或public (2) Base1(s1),Base2(s2) 或Base2(s2),Base1(s1)(3) Base1::str (4) test.print()20.(1) virtual void show()=0 (2) C(int,int,int) (注:参数可有任一名称)(3) b1(y) (4) &t8.3.3 编程题1.求长方形的面积和长方体的表面积、体积#include<iostream.h>class Rectangle{protected:float L; // 长方形的长float W; // 长方形的宽float area; // 长方形的面积public:Rectangle(float L1,float W1){L=L1;W=W1;}void function() { area=L*W; }void show(){cout<<"长为"<<L<<",宽为"<<W<<"的长方形面积为"<<area<<endl;}};class Cuboid:public Rectangle{float H; // 长方体的高float volume; // 长方体的体积public:Cuboid(float a,float b,float c):Rectangle(a,b){ H=c; }void function() { area=(L*W+L*H+W*H)*2; }void fun() { volume=L*W*H; }void show(){cout<<"长为"<<L<<",宽为"<<W<<",高为"<<H<<"的长方体表面积为"<<area<<",体积为"<<volume<<endl;}};void main(){Rectangle r(2,3); r.function(); r.show();Cuboid c(2,3,4); c.function(); c.fun(); c.show();}2.产生并输出圆桌信息#include<iostream.h>#include<string.h>class Circle{protected:double radius;double area;public:Circle(double r) { radius=r; }};class Table{protected:double height;public:Table(double h) { height=h; }};class Roundtable:public Table,public Circle{char *color;public:Roundtable(double h,double r,char c[]):Circle(r),Table(h) {color=new char[strlen(c)+1];strcpy (color, c);}void fun() { area=3.14*radius*radius; }void show(){cout<<"高度:"<<height<<"米"<<endl;cout<<"面积:"<<area<<"平方米"<<endl;cout<<"颜色:"<<color<<endl;}~Roundtable() { delete []color; }};void main(){Roundtable rt(0.75,1.1,"黑色");rt.fun(); rt.show();}3.计算企业的经营税#include<iostream.h>#include<string.h>class Tax{protected:char name[50]; // 企业名称double income; // 经营收入double taxes; // 税金public:Tax(char *n,double in){strcpy(name,n);income=in;}virtual void fun()=0;void show(){cout<<name<<"的经营收入为"<<income<<"万元,税金为"<<taxes<<"万元\n";}};class Service:public Tax{public:Service(char *n,double in):Tax(n,in){ }void fun(){taxes=income*5/100;}};class Fabrication:public Tax{public:Fabrication(char *n,double in):Tax(n,in){ }void fun(){taxes=income*17/100;}};void print(Tax &t) { t.fun(); t.show(); }void main(){char name[50];int income;cout<<"请输入服务性企业名称:"; cin>>name;cout<<"请输入经营收入(万元):"; cin>>income;Service s(name,income); print(s);cout<<"请输入生产性企业名称:"; cin>>name;cout<<"请输入经营收入(万元):"; cin>>income;Fabrication f(name,income); print(f);}4.把原始体育成绩转换为等第#include<iostream.h>class Sports{protected:int item; // 项目char name[20]; // 姓名double score; // 原始成绩char grade[10]; // 评定等第public:Sports(int i,char *n){item=i;strcpy(name,n);cout<<"请输入原始成绩:";cin>>score;}void show(){cout<<name<<"的"<<item<<"米成绩为"<<score<<"秒,等第为"<<grade<<endl;}virtual void change()=0;};class Run50:public Sports{public:Run50(int i,char *n):Sports(i,n){ }void change(){if(score<=6.50)strcpy(grade,"优秀");else if(score<=6.70)strcpy(grade,"良好");else if(score<=7.10)strcpy(grade,"及格");else strcpy(grade,"不及格");}};class Run100:public Sports{public:Run100(int i,char *n):Sports(i,n){ }void change(){if(score<=13.10)strcpy(grade,"优秀");else if(score<=13.70)strcpy(grade,"良好");else if(score<=14.90)strcpy(grade,"及格");else strcpy(grade,"不及格");}};class Run1000:public Sports{public:Run1000(int i,char *n):Sports(i,n){ }void change(){if(score<=203.00)strcpy(grade,"优秀");else if(score<=213.00)strcpy(grade,"良好");else if(score<=233.00)strcpy(grade,"及格");else strcpy(grade,"不及格");}};class Run1500:public Sports{public:Run1500(int i,char *n):Sports(i,n){ }void change(){if(score<=323.00)strcpy(grade,"优秀");else if(score<=337.00)strcpy(grade,"良好");else if(score<=365.00)strcpy(grade,"及格");else strcpy(grade,"不及格");}};void main(){Sports *s;int it;cout<<"请输入项目(50/100/1000/1500):"; c in>>it;char na[20];cout<<"请输入姓名:"; c in>>na;if(it==50) { Run50 r50(it,na); s=&r50; s->change(); s->show(); }else if(it==100) { Run100 r100(it,na); s=&r100; s->change(); s->show(); }else if(it==1000) { Run1000 r1000(it,na); s=&r1000; s->change(); s->show(); } else if(it==1500) { Run1500 r1500(it,na); s=&r1500; s->change(); s->show(); } else { cout<<"输入项目错误\n"; exit(0); }}8.4 实验指导8.4.1 派生类的定义与使用:设计一个程序求三角函数的值。

第8 继承与多态习题 - noanswer

第8 继承与多态习题 - noanswer

继承与多态习题一.基本概念与基础知识自测题8.1填空题8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。

(3)类的对象可作为(4)类的对象处理,反过来不行,因为(5)。

如果强制转换则要注意(6)。

答案:(1)基类(2)派生类(3)派生类(4)基类(5)派生类有一些新成员(6)只能派生类强制转换为基类8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员,protected成员成为派生类的(2)成员,对private成员是(3)。

公有派生可以使其类的(4),所以公有派生是主流。

答案:(1)public成员(2)protected成员(3)不可访问(4)接口不变8.1.3 利用继承能够实现(1)。

这种实现缩短了程序开发的时间,VC++中的(2)很好地体现了这一点。

答案:(1)代码的复用(2)MFC编程8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为(2)。

继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。

答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.5 C++中多态性包括两种多态性:(1)和(2)。

前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。

答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.1.6 在基类中将一个成员函数说明成虚函数后,在其派生类中只要(1)、(2)和(3)完全一样就认为是虚函数,而不必再加关键字(4)。

如有任何不同,则认为是(5)而不是虚函数。

除了非成员函数不能作为虚函数外,(6)、(7)和(8)也不能作为虚函数。

答案:(1)同虚函数名(2)同参数表(3)同返回类型。

如基类中返回基类指针,而派生类中返回派生类指针是允许的(4)virtual(5)重载(6)静态成员函数(7)内联函数(8)构造函数8.1.7 纯虚函数定义时在函数参数表后加 (1) ,它表明程序员对函数 (2) ,其本质是将指向函数体的指针定为 (3) 。

JAVA基础第章继承与多态练习题

JAVA基础第章继承与多态练习题

第4章继承与多态一.选择题1. 编译和运行以下两文件结果是( D )。

//文件P1.javapackage MyPackage;class P1{void afancymethod(){System.out.println("What a fancy method");}}//文件P2.javapackage YourPackage;import MyPackage.*;public class P2 extends P1{public static void main(String argv[]){P2 p2 = new P2();p2.afancymethod();}}A.两个均通过编译,P2运行时输出What a fancy methodB.没一个通过编译C.两个均通过编译,但P2运行时出错D.P1 通过编译,但P2出现编译错误2.下列程序运行的结果是(A )。

package a;package b;public class D{public static void main(String args[]) {System.out.println("^_^,今天心情不错!");}}A.出现编译错误B.^_^,今天心情不错!C.通过编译,运行时出错D.以上都不对3.Java的核心类库中哪个包,Java系统能自动引入(B )。

A.java.io B.ngC. D.java.util4.下列程序运行结果是( A )。

private class Base{Base(){int i = 100;System.out.println(i);}public class Pri extends Base{static int i = 200;public static void main(String argv[]){Pri p = new Pri();System.out.println(i);}}A.编译错误B.200 C.100 200 D.1005.下列程序运行结果是(C )。

继承和多态的实验题

继承和多态的实验题

继承和多态习题1.构造方法的调用顺序测试:1)创建类A1,实现构造方法中输出“This is A”;2)创建A1的子类B1,实现构造方法中输出“This is B”;3)创建B1的子类C1,实现构造方法中输出“This is C”;4)创建测试类,实例化C1的一个对象cc,分析构造方法的执行顺序。

2.方法的覆盖测试1)创建类A2,实现一个方法test(),里面输出“This is A method”;2)创建类A2的子类B2,重新实现一个方法test(),里面输出“This is B method”;3)创建测试类,创建B2的对象bb,调用bb.test(),观察父类方法是否被覆盖?4)修改B2的test()方法,加上super.test(),输出变化么?3.属性的隐藏测试1)在上题的基础上,在类A2中,声明并初始化一个变量:String name="AAA";2)在B2中也声明并初始化一个变量:String name="BBB";3)在B2中,创建一个方法t(),在里面输出name;4)在测试类中,创建B2的对象bb,调用bb.t(),看看输出的名字是什么?5)再修改t()方法,加上输出,观察输出结果?4.继承的应用1)编写一个商品类Good;(使用以前做过的)2)编写商品类的子类牛奶,增加了表示会员价格的属性,覆盖父类的计算折扣的方法,要求能计算出会员和非会员折扣后各是多要钱。

3)编写测试类,初始化牛奶的价格为3元,会员价格为2.6元,折扣的百分比为0.8,测试子类的应用,输出折扣后的价格。

5.多态在工资系统中的应用。

1)定义一个类Employee作为超类2)Employee的子类有Boss(每星期发给他固定工资,而不计工作时间)、PieceWorker(按其生产的产品数发放工资)。

3)对所有雇员类型都使用earnings()方法完成其工资单的计算,但每个人挣的工资按他所属的雇员类计算,所有雇员类都是从超类Employee派出生的。

JAVA基础第章继承与多态练习题

JAVA基础第章继承与多态练习题

第4章继承与多态一.选择题1. 编译和运行以下两文件结果是( D )。

//文件P1.javapackage MyPackage;class P1{void afancymethod(){System.out.println("What a fancy method");}}//文件P2.javapackage YourPackage;import MyPackage.*;public class P2 extends P1{public static void main(String argv[]){P2 p2 = new P2();p2.afancymethod();}}A.两个均通过编译,P2运行时输出What a fancy methodB.没一个通过编译C.两个均通过编译,但P2运行时出错D.P1 通过编译,但P2出现编译错误2.下列程序运行的结果是(A )。

package a;package b;public class D{public static void main(String args[]) {System.out.println("^_^,今天心情不错!");}}A.出现编译错误B.^_^,今天心情不错!C.通过编译,运行时出错D.以上都不对3.Java的核心类库中哪个包,Java系统能自动引入(B )。

A.java.io B.ngC. D.java.util4.下列程序运行结果是( A )。

private class Base{Base(){int i = 100;System.out.println(i);}public class Pri extends Base{static int i = 200;public static void main(String argv[]){Pri p = new Pri();System.out.println(i);}}A.编译错误B.200 C.100 200 D.1005.下列程序运行结果是(C )。

继承与多态的习题

继承与多态的习题

一:选择题1. 下面有关析构函数的说法中,不正确的是( )A.析构函数中不可包含Return语句B.一个类中只能有一个析构函数C.用户可定义有参析构函数D.析构函数在对象被撤销时,被自动调用2.派生类不可以访问基类的( )A.Public成员B.Private成员C.Protected成员D.Protected internel成员3.有关sealed修饰符,描述正确的是( )A.密封类可以被继承B.abstract修饰符可以和sealed修饰符一起使用C.密封类不能实例化D.使用sealed修饰符可保证此类不能被派生4.若想从派生类中访问基类的成员,可以使用( )A.this关键字B.me关键字C.base关键字D.override关键字5.下面有关派生类的描述中,不正确的是( )A.派生类可以继承基类的构造函数B.派生类可以隐藏和重载基类的成员C.派生类不能访问基类的私有成员D.派生类只能有一个直接基类6.C#中,继承具有( ),即A类派生B类,B类又派生C类,则C类会继承B类中的成员和A类中的成员。

A.传递性B.多态性C.单继承D.多继承7.下面有关静态方法的描述中,错误的是( )A.静态方法属于类,不属于实例B.静态方法可以直接用类名调用C.静态方法中,可以定义非静态的局部变量D.静态方法中,可以访问实例方法8.下面关于运算符重载的描述中,错误的是( )A.重载的运算符仍然保持其原来的操作数个数、优先级和结合性不变B.可以重载双目运算符,不可以重载单目运算符C.运算符重载函数必须是public的D.运算符重载函数必须是static的9.下面对派生类和基类的关系的描述中,不正确的是( )A.派生类的方法可以和基类的方法同名B.派生类是对基类的进一步扩充C.派生类也可作另一个派生类的基类D.派生类继承基类的公有、保护和私有成员10.下面关于虚方法的描述中,正确的是()A.虚方法可以实现静态联编B.在一个程序中,不能有同名的虚方法C.虚方法必须是类的静态成员D.在派生类中重写虚方法,必须加上override修饰符二、判断:class A{private int x;public A(int i){x = i;}}class B : A{private int y;public B(){y = 0;}public B(int i):base(i){y = i;}public B(int i, int j) : base(i){y = j;}}三:程序填充:1. 以下程序的输出结果是:Base class…..Derived class…请在空白处填入适当内客,把程序补充完整。

05继承与多态

05继承与多态
1 public class Test{
2public static void main(String args[]){
3Vehicle v;
4Car c;
5v=new Vehicle();
6c=new Car();
7v.drive();
8c.drive();
9v=c;
10v.drive();
11}
3int s;
4s = a+b;
5return s;
6}}
7class Child extends Parent {
8 }
Aint addValue( int a, int b ){// do something...}
Bpublic void addValue (){// do something...}
17.试图编译、运行下列程序,结果是什么?【选择一项】
class Parent{
int a = 55;
public void function(){
System.out.println("Parent's function()");
}
Parent(){
System.out.println("This isParent");
6 private String department;
7 public Child() {}
8 public String getValue(){ return name; }
9 public static void main(String arg[]) {
10 Parent p = new Parent();
BDB
CBDC

c++程序设计类的继承和多态编程题

c++程序设计类的继承和多态编程题

一、继承的意义和应用1. 继承是面向对象编程中的重要概念,它允许一个类继承另一个类的属性和方法。

2. 在C++程序设计中,继承可以减少代码重复,提高代码的复用性和可维护性。

3. 通过继承,子类可以扩展或修改父类的行为,实现代码的灵活性和可扩展性。

二、继承的语法和实现1. 在C++中,使用关键字“class”定义一个类,通过“:”符号实现继承。

2. 派生类可以继承基类的公有成员和保护成员,但不能继承基类的私有成员。

3. 在派生类中,可以通过作用域解析运算符“::”访问基类的成员。

三、多态的概念和特点1. 多态是面向对象编程中的重要特性,它允许不同类的对象对同一消息作出不同的响应。

2. 多态可以增加程序的灵活性和可扩展性,提高代码的可读性和可维护性。

3. C++中实现多态的方式包括虚函数、纯虚函数和函数重载。

四、C++中实现多态的方法1. 虚函数是实现多态的关键,通过在基类中声明虚函数,在派生类中重写虚函数实现多态。

2. 纯虚函数是一种特殊的虚函数,它没有具体的实现,只是一个接口,必须在派生类中实现。

3. 函数重载允许在同一个作用域中定义多个同名函数,根据参数的不同实现不同的行为,也可以实现多态效果。

五、继承和多态的应用场景1. 继承和多态在实际的软件开发中有着广泛的应用,例如在设计图形界面控件时,可以使用继承和多态实现不同控件的共性和个性.2. 在游戏开发中,通过继承和多态可以实现不同角色的行为和动作。

3. 在企业应用中,可以通过继承和多态实现不同部门或员工的管理和操作。

六、C++程序设计中的继承和多态案例分析1. 通过一个实际的案例,演示如何使用C++实现继承和多态。

2. 分析案例中的设计思路和代码实现,介绍继承和多态在程序设计中的作用和效果。

3. 总结案例中的经验和教训,为读者提供实践经验和指导。

七、总结1. 继承和多态是C++程序设计中的重要内容,它可以提高代码的复用性和可维护性,增加程序的灵活性和可扩展性。

java封装继承多态选择题附加答案解析

java封装继承多态选择题附加答案解析

java封装继承多态选择题附加答案解析1. 封装的主要目的是:A. 增加代码的长度B. 隐藏实现细节C. 使所有方法都公有D. 提高程序运行速度答案: B。

解析:封装是面向对象编程的重要原则,通过将数据和方法封装在类中,隐藏内部实现细节,提高代码的可维护性和安全性。

2. 在以下选项中,哪一种方法用于实现封装?A. 使用`public`关键字定义所有成员B. 使用`private`关键字隐藏类的实现细节C. 使用`static`关键字定义所有成员D. 使用`final`关键字定义所有成员答案: B。

解析:封装是通过使用`private`关键字将类的实现细节隐藏起来,并提供公共的访问方法(getter和setter)来访问这些私有成员。

3. 在Java中,如果类B继承自类A,则下列哪个选项是正确的?A. 类B是类A的超类B. 类A是类B的子类C. 类A是类B的超类D. 类B不能有自己的方法答案: C。

解析:类A是类B的超类,类B是类A的子类。

子类可以有自己的方法和属性。

4. 在以下哪个情况下,一个方法被认为是重写了另一个方法?A. 当方法具有相同的名称但不同的参数列表时B. 当方法在子类中重新实现且具有相同的名称、返回类型和参数列表时C. 当方法在同一个类中被定义了两次时D. 当方法在类中没有定义时答案: B。

解析:方法重写发生在子类中,要求被重写的方法在子类中具有相同的方法名、返回类型和参数列表。

5. 在以下访问修饰符中,哪个是最具限制性的?A. publicB. protectedC. default(无修饰符)D. private答案: D。

解析:`private`是最具限制性的访问修饰符,只有在同一个类中可以访问。

6. 以下哪个场景中体现了多态性?A. 一个方法有多个重载版本B. 一个类有多个构造方法C. 一个子类可以使用父类的属性和方法D. 父类的引用指向子类的对象答案: D。

解析:多态性允许父类的引用指向子类的对象,实际调用的方法取决于对象的运行时类型。

继承,封装,多态的习题

继承,封装,多态的习题

作业要求:使学员掌握类之间继承的关系,掌握super关键字的作用,抽象类的使用,如何操作子类及父类等技术点。

1、给出一个类TestArray,具有堆栈的功能1) add(Object obj) 添加数据2) get(i) 读取数据3) clear() 清除所有数据4) getSize() 返回数据长度2、要求创建一个自定义的类继承TestArray类,增加以下功能3、增加add(Integer i)方法可以直接添加INT类型数据4、增加sort方法,对数据进行排序进行排序给出的TestArray类源码package com.test.action;public abstract class TestArray{private Object[] obj;public TestArray() {obj=new Object[1];}public TestArray(int i) {obj = new Object[i];}public boolean add(Object obj) {int j=0;if (obj==null)return false;for(int i=0;i<this.obj.length;i++) {if(this.obj[i]==null) {j+=1;this.obj[i]=obj;break;}}if(j==0) {Object[] obj2 = new Object[this.obj.length+1];for(int i=0;i<this.obj.length;i++) {obj2[i]=this.obj[i];}obj2[this.obj.length]=obj;this.obj=obj2;return true;}public int getSize() {return obj.length;}public Object get(int i) {return this.obj[i];}public void clear() {obj=new Object[1];}}效果显示:作业前提:第二部分\第二节课继承,封装,多态。

c++继承与多态

c++继承与多态

1 使用派生类的主要原因是()A. 提高代码的可重用性B. 提高程序的运行效率C. 加强类的封装性D. 实现数据的隐藏2 在C++中继承方式有几中()A. 1B. 2C.3 D. 43 假设已经定义好了类student,现在要定义类derived,它是从student私有派生的,则定义类derived的正确写法是()A. class derived :student private{ //………….}B. class derived :student public { //………….}C. class derived :public student { //………….}D. class derived :private student{ //………….}4 派生类的对象对它的基类成员中()是可以访问的。

A.公有继承的公有成员;B.公有继承的私有成员;C.公有继承的保护成员;D.私有继承的公有成员。

5 在公有继承的情况下,基类私有成员在派生类中的访问权限()。

A、不受限制B、保持不变C、受保护D、不能访问6 实现运行时的多态性用。

A、重载函数B、构造函数C、析构函数D、虚函数7 派生类的构造函数的成员初始化列中,不能包含()。

A. 基类的构造函数;B. 派生类中子对象的初始化;C. 基类的子对象初始化;D. 派生类中一般数据成员的初始化8 下列关于虚函数的说明中,正确的是()。

A) 从虚基类继承的函数都是虚函数。

B) 虚函数不得是静态成员函数。

C) 只能通过指针和引用调用虚函数。

D) 抽象类中的成员函数都是虚函数。

9 关于保护继承的说法正确的是()。

A)基类的公有,继承后变为保护 B)基类的公有,继承后变为公有 c)基类的保护,继承后变为私有 d)基类的私有,继承后变为私有10 类B是类A的派生类,继承方式是public,下列说法不正确的是()A.B的成员函数的实现可以访问A的public类型的成员变量;B .B的成员函数的实现可以访问A的protected类型的成员变量;C .可以访问B的对象中A的protected类型的成员变量;D .可以访问B的对象中A的public类型的成员变量;11 下列哪个运算符表示的类型转换需要在运行时刻进行()A.dynamic_cast B.const_cast C.static_cast D.reinterpret_cast12 声明自定义类型中的虚函数,需要使用关键字()A.mutable B.typename C.virtual D.template13 关于纯虚函数和抽象类的描述中,()是错误的。

实验9 继承和多态练习

实验9 继承和多态练习

实验9 继承和多态练习一. 实验目的及要求1. 了解C++/CLI 中的继承:继承的概念、派生类的定义、派生类成员的组成、成员的覆盖和标识、赋值兼容规则等等。

2. 了解C++/CLI 中的多态:多态的概念、多态的实现方法、与多态有关的关键字等等,并通过对两个完整实例的研究,理解多态的含义、功能和编程方法。

二. 实验内容及步骤1. 有关继承和多态的知识点和例题⑴ 继承继承(inheritance)是面向对象设计的重要方法和面向对象的三个重要特征(封装性、继承性和多态性)之一。

从字面上说,继承就是得到父辈的遗产,在这个基础上发展自己的事业,而不必从头做起。

在类的设计中,我们会发现许多类都存在共性,一方面我们可以将这些共性抽象出来,设计成一些称为基类(或父类)的类,另一方面我们可以利用面向对象的继承机制,在基类之上设计出一些称为子类(派生类)的类,来拓展基类的功能。

现实生活中继承的例子很多。

例如在自然科学中,狼、狗、狐等存在着某些共性,生物学家把它们抽象为“犬类”以描述它们的共性,然后在该大类基础上,根据每种动物的特性,再进一步细分为狼、狗、狐等子类;又例如在社会科学中,“学生”是一个基类,他们具有学号、姓名、成绩等等共性,小学生、中学生、大学生、研究生等则是子类,他们各有各的特性,可以用一组附加的属性和行为来描述。

面向对象设计的出发点之一是增强软件的可重用性,继承便是实现软件可重用性的重要途径。

与之相对,面向过程方法的可重用性是靠功能模块(即函数)的重复调用来实现的,由于功能的设计与对象的属性分离,因此一旦数据(类型或数据结构)发生变化,函数便要重新设计。

为了克服这一缺陷,人们想了许多办法,包括模板和泛型方法,在所有这些方法中,面向对象设计围绕着对象属性的抽象和继承具有最重要的意义。

就像自然界和人类社会的分类都是相对的一样,程序中类的层次也是相对的。

一个父类可能是另一个父类的子类,一个子类之下可能还有子类,从而构成一个“树状结构”,称为“类族”,如下图所示: 人类认识事物往往有一个从特殊到一般,再从一般到特殊的过程。

实验五 继承性和多态性练习

实验五  继承性和多态性练习

实验五继承性和多态性练习【开发语言及实现平台或实验环境】Windows2000 或XP,JDK1.6与Jcreator4.0【实验目的】1.了解类的继承性和多态性的作用。

2.了解Java 中接口(interface)的作用。

3.掌握接口的设计方法。

【实验要求】1. 编写体现类的继承性(成员变量,成员方法,成员变量隐藏)的程序。

2.编写体现类多态性(成员方法重载,构造方法重载)的程序。

3. 掌握使用系统接口的技术和创建自定义接口的方法。

【实验步骤】一、类的继承性练习1.进一步理解继承的含义新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们加以修改。

新类还可添加新的变量和方法。

这种现象就称为类的继承。

当建立一个新类时,不必写出全部成员变量和成员方法。

只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。

被继承的类称为父类或超类(superclass),这个新类称为子类。

Java 提供了一个庞大的类库让开发人员继承和使用。

设计这些类是出于公用的目的,因此,很少有某个类恰恰满足你的需要。

你必须设计自己的能处理实际问题的类,如果你设计的这个类仅仅实现了继承,则和父类毫无两样。

所以,通常要对子类进行扩展,即添加新的属性和方法。

这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。

继承的意义就在于此。

2.创建公共类LX3_1_P(1)编写程序文件LX3_1_P.java,源代码如下。

public class LX3_1_P{protected String xm; //具有保护修饰符的成员变量protected int xh;void setdata(String m,int h) //设置数据的方法{xm =m;xh = h;}public void print() //输出数据的方法{System.out.println(xm+", "+xh);}}(2)编译LX3_1_P.java,产生类文件LX3_1_P.class。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

继承与多态习题一.基本概念与基础知识自测题8.1填空题8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。

(3)类的对象可作为(4)类的对象处理,反过来不行,因为(5)。

如果强制转换则要注意(6)。

答案:(1)基类(2)派生类(3)派生类(4)基类(5)派生类有一些新成员(6)只能派生类强制转换为基类8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员,protected成员成为派生类的(2)成员,对private成员是(3)。

公有派生可以使其类的(4),所以公有派生是主流。

答案:(1)public成员(2)protected成员(3)不可访问(4)接口不变8.1.3 利用继承能够实现(1)。

这种实现缩短了程序开发的时间,VC++中的(2)很好地体现了这一点。

答案:(1)代码的复用(2)MFC编程8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为(2)。

继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。

答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.5 C++中多态性包括两种多态性:(1)和(2)。

前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。

答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.1.6 在基类中将一个成员函数说明成虚函数后,在其派生类中只要(1)、(2)和(3)完全一样就认为是虚函数,而不必再加关键字(4)。

如有任何不同,则认为是(5)而不是虚函数。

除了非成员函数不能作为虚函数外,(6)、(7)和(8)也不能作为虚函数。

答案:(1)同虚函数名(2)同参数表(3)同返回类型。

如基类中返回基类指针,而派生类中返回派生类指针是允许的(4)virtual(5)重载(6)静态成员函数(7)内联函数(8)构造函数8.1.7 纯虚函数定义时在函数参数表后加(1),它表明程序员对函数(2),其本质是将指向函数体的指针定为(3)。

答案:(1)=0(2)不定义(3)NULL8.2简答题8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。

派生类构造函数各部分的执行次序是:1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。

2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。

3.派生类的构造函数体中的操作。

8.2.2什么叫派生类的同名覆盖(override)?答:如果派生类声明了一个和某个基类成员同名的新成员(当然如是成员函数,参数表也必须一样,否则是重载),派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。

称为同名覆盖(override)。

8.2.3派生类的析构函数中需完成什么任务?是否要编写对基数和成员对象的析构函数的调用?为什么?答:析构函数的功能是作善后工作,析构函数无返回类型也没有参数,情况比较简单。

派生类析构函数定义格式与非派生类无任何差异,不要编写对基数和成员对象的析构函数的调用,只要在函数体内把派生类新增一般成员处理好就可以了,因为对新增的成员对象和基类的善后工作,系统会自己调用成员对象和基类的析构函数来完成。

8.2.4为什么要使用虚基类?怎样定义虚基类?用一个实例来解释虚基类在其派生类中的存储方式。

答:在多重继承是有可能出现同一基类的两个拷贝,为避免这种情况,可使用虚基类。

虚基类(virtual base class)定义方式如下:class派生类名:virtual 访问限定符基类类名{...};class派生类名:访问限定符virtual基类类名{...};virtual 关键字只对紧随其后的基类名起作用。

如下派生:(a )派生关系(b )存储图存储关系如(b),在职研究生类有两个Person 拷贝。

采用虚基类后存储关系如下:在职研究生类只有一个Person 拷贝。

8.2.5 简单叙述派生类与基类的赋值兼容规则。

答:凡是基类所能解决的问题,公有派生类都可以解决。

在任何需要基类对象的地方都可以采用虚基类后在职研究生类储存图用公有派生类的对象来代替,这条规则称赋值兼容规则。

它包括以下情况:1.派生类的对象可以赋值给基类的对象,这时是把派生类对象中从对应基类中继承来的成员赋值给基类对象。

反过来不行,因为派生类的新成员无值可赋。

2.可以将一个派生类的对象的地址赋给其基类的指针变量,但只能通过这个指针访问派生类中由基类继承来的成员,不能访问派生类中的新成员。

同样也不能反过来做。

3.派生类对象可以初始化基类的引用。

引用是别名,但这个别名只能包含派生类对象中的由基类继承来的成员。

8.2.6在类中定义对象成员称为复合或嵌套,请对比复合与继承的异同之处。

答:成员对象是嵌套的概念,使用成员对象中的成员,只能直接访问(对象名加点号加成员名)公有成员。

在类的成员函数中不能直接访问和处理成员对象的私有和保护成员,而要通过成员对象的接口去间接访问和处理。

某些应用中,对象成员可以代替继承中的基类。

基类在派生类中只能继承一个(间接基类不在讨论之中)不能同时安排两个,否则成员名即使使用域分辨符也会发生冲突,但如果一定要用两个,只能采用成员对象。

所以采用成员对象更加灵活。

两者不是对立的,而是互为补充的。

8.2.7比较派生与模板各自的优点。

答:模板追求的是运行效率,而派生追求的是编程的效率。

通用性是模板库的设计出发点之一,这是由泛型算法和函数对象等手段达到的。

为了运行的效率,类模板是相互独立的,即独立设计,没有使用继承的思想。

对类模板的扩展是采用适配子(adapter)来完成的。

应该说派生类的目标之一也是代码的复用和程序的通用性,最典型的就是MFC,派生类的优点是可以由简到繁,逐步深入,程序编制过程中可以充分利用前面的工作,一步步完成一个复杂的任务。

8.2.8是否使用了虚函数就能实现运行时的多态性?怎样才能实现运行时的多态性?答:不是。

实现动态多态性时,必须使用基类类型的指针变量或引用,使该指针指向该基类的不同派生类的对象,并通过该指针指向虚函数,才能实现动态的多态性。

8.2.9为什么析构函数总是要求说明为虚函数?答:在基类中及其派生类中都动态分配内存空间时,必须把析构函数定义为虚函数,实现撤消对象时的多态性。

根据赋值兼容规则可以用基类的指针指向派生类对象,如果由该指针撤销派生类对象,则必须将析构函数说明为虚函数,实现多态性,自动调用派生类析构函数。

我们总是要求将类设计成通用的,无论其他程序员怎样调用都必须保证不出错,所以必须把析构函数定义为虚函数。

8.2.10什么是抽象类?含有纯虚函数的类是抽象类吗?答:若定义一个类,它只能用作基类来派生出新的类,而不能用来定义对象,则称为抽象类。

含有纯虚函数的类是抽象类。

8.2.11能否不提供源代码,做到用户自行把通用的软件转化为专用软件?怎样实现?答:能不提供源代码,做到用户自行把通用的软件转化为专用软件。

动态联编不一定要源代码,可以只有头文件和对象文件的.obj文件。

软件开发商可在不透露其秘密的情况下发行.obj 形式的软件,然后由程序员利用继承机制,从所购得的类中派生出新类。

能与软件开发商提供的类一起运行的软件也能与派生类一起运行,并能通过动态联编使用这些派生类中重定义的虚函数。

比如通用的财务软件可以转化为某公司的专用软件。

二.编程与综合练习题8.3请用类的派生方式来组织下列动物实体与概念:动物,脊椎动物亚门,节肢动物门,鱼纲,鸟纲,爬行纲,哺乳纲,昆虫纲,鲨鱼,青鱼,海马,鹦鹉,海鸥,喜鹊,蝙蝠,翼龙,蜻蜓,金龟,扬子鳄,袋鼠,金丝猴,虎,蜈蚣,蜘蛛,蝗虫,知了,螃蟹,虾。

解:动物派生出:脊椎动物亚门和节肢动物门。

脊椎动物亚门派生出:鱼纲,鸟纲,爬行纲,哺乳纲。

鱼纲派生出:鲨鱼,青鱼,海马。

鸟纲派生出:鹦鹉,海鸥,喜鹊。

爬行纲派生出:翼龙,金龟,扬子鳄。

哺乳纲派生出:蝙蝠,袋鼠,金丝猴,虎。

节肢动物门派生出:昆虫纲,蜈蚣(多足纲),蜘蛛(蜘形纲),螃蟹,虾(甲壳纲)。

昆虫纲派生出:蜻蜓,蝗虫,知了。

8.4定义商品类及其多层的派生类。

以商品类为基类。

第一层派生出服装类、家电类、车辆类。

第二层派生出衬衣类、外衣类、帽子类、鞋子类;空调类、电视类、音响类;自行车类、轿车类、摩托车类。

要求给出基本属性和派生过程中增加的属性。

解:按题意没有操作,所以只列出数据成员,也不再检验#include <iostream>using namespace std;class Commodity{double price; //价格char name[20];//商品名char manufacturer[20];//生产厂家int items;//数量};class Clothing:public Commodity{//服装类char texture[20];//材料质地};class Electric_Appliance:public Commodity{//家电类enum {Black,White}type;//黑白家电};class Vehicle:public Commodity{//车辆类int wheel_num;//车轮数量};class Shirt:public Clothing{//衬衣类enum {Formal,Casual}Style;//式样:正式、休闲};class Garment:public Clothing{//外衣类enum {Jacket,Coat}Style;//式样:夹克、外套};class Hat:public Clothing{//帽子类;enum {Winter,Summer,Spring_Autumn}Style;//季节风格};class Shoes:public Clothing{//鞋子类enum {Winter,Summer,Spring_Autumn}Style;//季节风格};class Air_Cindition:public Electric_Appliance{//空调bool warm_cool; //是否冷暖float power;//功率};class Television:public Electric_Appliance{//电视类int Size; //尺寸bool isColor;//是否彩色};class Acoustics:public Electric_Appliance{//音响类int speaker_num; //喇叭数目float power; //功率};class Bicycle:public Vehicle{//自行车类int speed_grades; //调速级数int wheel_size; //轮子大小};class Car:public Vehicle{//轿车类float volume; //排气量bool isSkylight; //是否有天窗int box_num; //厢数};class Motorcycle:public Vehicle{//摩托车类float volume; //排气量};int main(){return 0;}8.5以点(point)类为基类,重新定义矩形类和圆类。

相关文档
最新文档