第八章 继承与多态习题(C++)
C 试题-第八章

C++第八章试题一.填空题(每空1分)1. B类继承自A类,则称A类是B类的_基(父)类,B类是A类的_派生(子)类。
2. 类的继承有三种继承方式,分别是_公有继承_、___保护继承_和___私有继承___。
3. B类继承自A类,则B类__不能___访问A类的私有数据成员。
4. C类继承自B类,B类继承自A类,则创建C类对象时,构造函数的调用顺序为先__A__类构造的函数,再__B__类构造的函数,最后__C__类的构造函数。
5. A类中有函数fun( )、现有B类、C类都继承A类,D类同时继承B类、C类,为避免D 类对象访问fun( )函数时冲突,则在A类中把fun( )函数声明为__虚__函数可以解决冲突问题。
二.选择题(每题2分)1. 关于对象和类的关系,说法正确的是(C)。
A.同属于一类的对象,具有相同的数据成员和成员函数。
B.对象是具体,是类的对象,同其他变量一样,先定义后使用。
C.同一类的不同对象,其具有的操作可不同,具体的操作也不同。
D.不同类的对象,可有相同的操作。
2. 对基类和派生类的关系描述中,错误的是(B)A.派生类是基类的具体化B. 基类继承了派生类的属性C. 派生类是基类定义的延续D. 派生类是基类的特殊化3. 在公有派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的(A)A. 私有成员B. 公有成员C. 保护成员D. 保护成员或私有成员4. 构造函数是在(B)时被执行的。
A. 程序编译B. 创建对象C. 创建类D. 程序装入内存5. 下列关于虚函数的说明中,正确的是( B )。
A.从虚基类继承的函数都是虚函数。
B.虚函数不得是静态成员函数。
C.只能通过指针和引用调用虚函数。
D.抽象类中的成员函数都是虚函数。
三.简答题(10分)1. 简述继承的作用。
简答要点:继承可以使派生类能够使用基类的公有和保护成员变量、函数。
可以实现代码复用,派生类可重新定义基类的公有和保护数据成员或函数,也可以在基类基础上增加新的数据成员和函数。
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中,能使派生类的功能可以被基类的方法或引用变量所调用,向后兼容,这种方法叫做()。
C++面向对象程序设计第8章 继承与派生习题解答

第8章习题一、概念题1.解答要点如下。
⑴采用public公有派生,基类成员的访问权限在派生类中保持不变,即基类所有的公有或保护成员在派生类中仍为公有或保护成员。
public派生最常用,可以在派生类的成员函数中访问基类的非私有成员,可通过派生类的对象直接访问基类的公有成员。
⑵采用private私有派生,基类所有的公有和保护成员在派生类中都成为私有成员,只允许在派生类的成员函数中访问基类的非私有成员。
private派生很少使用。
⑶采用protected保护派生,基类所有的公有和保护成员在派生类中都成为保护成员,只允许在派生类的成员函数和该派生类的派生类的成员函数中访问基类的非私有成员。
2.解答要点如下。
派生类构造函数的执行次序:首先,调用基类构造函数,调用顺序按照它们被继承时声明的基类名顺序执行;其次,调用内嵌对象构造函数,调用次序为各个对象在派生类内声明的顺序;最后,执行派生类构造函数体中的内容。
派生类析构函数执行过程与构造函数执行过程相反。
即当派生类对象的生存期结束时,首先调用派生类的析构函数,然后调用内嵌对象的析构函数,再调用基类的析构函数。
3.解答要点如下。
在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。
引进虚基类的目的是为了解决二义性问题,使得公共基类在它的派生类对象中只产生一个基类子对象。
二、填空题1.派生类基类2.public、protected、private3.virtual4.基类派生类自身5.成员函数三、编程题1.#include<iostream.h>#include<string.h>#include<iomanip.h>class base //定义一个基类{protected:char name[20]; //姓名char sex[3]; //性别int age; //年龄…};class teacher:public base //基类派生出教师类{ int sno; //工号char zc[20]; //职称double wages; //工资…};class student :public base //基类派生出学生类{ int sno; //学号char bj[10]; //班级char zy[10]; //专业double score; //入学成绩…};2.class Shape{public:virtual float area()=0;};float total(Shape *s[],int n){float sum=0.0;for(int i=0;i<n;i++)sum+=s[i]->area();return sum;}class Triangle:public Shape{public:Triangle(double h,double w){H=h;W=w;}double area() const{return H*W*0.5;}private:double H,W;};class Rectangle:public Shape{public:Rectangle(double h,double w){H=h;W=w;}double area()const{return H*W;}private:double H,W;};3.#include<iostream.h>class Vehicle{protected:int wheels;double weight;public:void initialize(int whls, double wght);int get_wheels() { return wheels; }double get_weight() { return weight; }double wheel_loading() { return weight/wheels; }};class Car:public Vehicle{private:int passenger_load;public:void initialize(int whls, double wght, int people =4);int passengers() { return passenger_load; }};class Truck: public Vehicle{private:int passenger_load;double payload;public:void init_truck(int number =2, double max_load =24000.0);double efficiency();int passengers() { return passenger_load; }};void Vehicle::initialize(int whls, double wght){wheels=whls;weight=wght;}void Car::initialize(int whls, double wght, int people){wheels=whls;weight=wght;passenger_load=people;}void Truck::init_truck(int number, double max_load){passenger_load=number;payload=max_load;}double Truck::efficiency(){return payload/(payload+weight);}void main(){Vehicle bicycle;bicycle.initialize(2,25);cout<<"the bicycle has "<<bicycle.get_wheels()<<" wheels.\n";cout<<"the bicycle weighs "<<bicycle.get_weight()<<" pounds.\n";cout<<"the bicycle's wheel loading is "<<bicycle.wheel_loading()<<" pounds per tire.\n\n";Car audi;audi.initialize(4,3500.0,5);cout<<"the audi has "<<audi.get_wheels()<<" wheels.\n";cout<<"the audi weighs "<<audi.get_weight()<<" pounds.\n";cout<<"the audi's wheel loading is "<<audi.wheel_loading()<<" pounds per tire.\n\n";Truck jief;jief.initialize(18,12500.0);jief.init_truck(2,33675.0);cout<<"the jief has "<<jief.get_wheels()<<" wheels.\n";cout<<"the jief weighs "<<jief.get_weight()<<" pounds.\n";cout<<"the jief's efficiency is "<<100.0*jief.efficiency()<<" percent.\n";}。
第8章习题答案

第八章多态1.单选题(1).下列关于运算符重载的描述中,( D )是正确的。
(A) 可以改变参与运算的操作数个数 (B) 可以改变运算符原来的优先级(C) 可以改变运算符原来的结合性(D) 不能改变原运算符的语义(2).下列函数中,不能重载运算符的函数是( b )。
(A) 成员函数(B) 构造函数(C) 普通函数 (D) 友员函数(3).要求用成员函数重载的运算符是( A )。
(A) =(B) == (C) <= (D) ++(4).要求用友员函数重载的运算符是( C )。
(A) = (B) [] (C) <<(D) ()(5).在C++中,要实现动态联编,必须使用( D )调用虚函数。
(A) 类名(B) 派生类指针(C) 对象名(D) 基类指针(6).下列函数中,不能说明为虚函数的是( C )。
(A) 私有成员函数(B) 公有成员函数(C) 构造函数(D) 析构函数(7).在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值( A )。
(A) 相同(B)不同(C) 相容(D) 部分相同(8).C++中,根据(D )识别类层次中不同类定义的虚函数版本。
(A) 参数个数(B) 参数类型(C) 函数名(D) this指针类型(9).虚析构函数的作用是(C )。
(A) 虚基类必须定义虚析构函数(B) 类对象作用域结束时释放资源(C)delete动态对象时释放资源(D) 无意义(10).下面函数原型中,( B )声明了fun为纯虚函数。
(A) void fun()=0; (B) virtual void fun()=0;(C) virtual void fun(); (D) virtual void fun(){ };(11).若一个类中含有纯虚函数,则该类称为( C )。
(A) 基类(B)纯基类(C) 抽象类(D) 派生类(12).假设Aclass为抽象类,下列正确的说明语句是( B )。
C 第八章继承与派生习题习题解答

第八章继承与多态习题一.基本概念与基础知识自测题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.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为(2)。
继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。
答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.6 C++中多态性包括两种多态性:(1)和(2)。
前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。
答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.2简答题(以下习题题号可能和教材不一致!)8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。
派生类构造函数各部分的执行次序是:1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。
2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。
3.派生类的构造函数体中的操作。
8.2.2什么叫派生类的同名覆盖(override)?答:如果派生类声明了一个和某个基类成员同名的新成员(当然如是成员函数,参数表也必须一样,否则是重载),派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。
C、C++程序设计:类、继承、多态单元测试与答案

一、单选题1、关于静态数据成员的描述不正确的是()。
A.静态数据成员是所有对象共有的成员。
B.静态数据成员初始化时一定要在前面加修饰符static。
C.静态数据成员在内存中占有固定内存。
D.静态数据成员在类体外初始化。
正确答案:B2、假设person是一个类,p1是该类的一个对象,p2是指向p1的指针,getname是该类的一个成员函数,则以下不正确的表达是()。
A.person.getname( );B.p1.getname( )C.p2->getname( )D.p1.person::getname( );正确答案:A3、下列静态数据成员的特性中,()是错误的。
A.静态数据成员在类体外进行初始化B.说明静态数据成员时前边要加关键字static来修饰C.静态数据成员初始化时,要在静态数据成员名前加类名和作用域运算符D.静态数据成员不是所有对象所共有的成员正确答案:D4、关于常数据成员的说法不正确的是()。
A.常数据成员通过构造函数的成员初始化列表进行初始化B.常数据成员的定义与一般常量的定义形式相同,但需定义在类体中C.常数据成员可以在定义时直接初始化D.常数据成员必须进行初始化,并且不能被更新正确答案:C5、对于类中定义的成员,其隐含访问权限为()。
A.staticB.privateC.protectedD.public正确答案:B6、下列特性中不是面向对象程序设计语言所特有的是()。
A.模板B.继承C.多态性D.数据封装正确答案:A7、下列对派生类的描述中,错误的是( )。
A.派生类中继承的基类成员的访问权限到派生类保持不变。
B.派生类至少有一个基类。
C.派生类的成员除了其自身的成员外,还包含了其基类的成员。
D.一个派生类可以作为另一个派生类的基类。
正确答案:A8、在公有继承中,派生类成员函数不可以访问( )。
A.基类中的保护成员B.基类中的公有成员C.基类中的私有成员D.派生类中的私有成员正确答案:C9、#include "iostream"using namespace std;class A{char c;public:A(char n){c=n;}~A(){cout<<c;};};class B:public A{char c;public:B(char n):A(n+1){c=n;}~B(){cout<<c;};};int main(){B b('X');b.~B();system("pause");return 0;}A.XYB.XC.YXD.Y正确答案:A10、假设在以下派生类的fun函数中调用了基类的fun函数,则空白处应填写()class AA{public:void fun(){cout<<"aa fun called"<<endl;}};class BB:public AA{public:void fun(){_________________;cout<<"bb fun called"<<endl; }};A.AA.fun();B.fun();C.AA::fun();D.AA->fun();正确答案:C11、关于虚函数的描述中,()是正确的。
C++(练习)第8章,继承与派生

C++(练习)第8章,继承与派生一,单选题1.下列描述中错误的是( )。
A 继承分为多重继承和单继承B 对象间通信靠传递消息实现C 在外面看不到对象的内部特征是基于对象的"模块独立性好"这个特征D 类是具有共同属性、共同方法的对象的集合参考答案C2. 设有以下定义:#includeclass A1{public:void show1() { cout<<"class A1"<<="">};class A2: public A1{public:void show2( ) { cout<<"class A2"<<="">};class A3: protected A2{public:void show3( ) { cout<<"class A3"<<="">};void main(){A1 obj1;A2 obj2;A3 obj3;...}以下不合法的调用语句是( )。
A obj1.show1();B obj2.show1();C obj3.show1();D obj2.show2();参考答案C3. 下列描述中哪个是正确的__________。
A 私有派生的子类无法访问父类的成员B 类A的私有派生子类的派生类C无法初始化其祖先类A对象的属性,因为类A的成员对类C是不可访问的C 私有派生类不能作为基类派生子类D 私有派生类的所有子孙类将无法继续继承该类的成员参考答案B4. 下面有关派生类的说法中,错误的是( )。
A 一个派生类可以作为另一个派生类的基类B 一个派生类可以有多个基类C 派生类构造函数可以将初始化参数值传递给基类的构造函数和对象成员的构造函数D 具有继承关系时,基类成员在派生类中的访问权限不变参考答案D5. 设置虚基类的目的是( )。
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 )。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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拷贝。
采用虚基类后存储关系如下:采用虚基类后在职研究生类储存图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)类为基类,重新定义矩形类和圆类。