1.什么是类的继承与派生?
继承性是面向对象程序设计的第二个重要特性,通过继承实现了数据抽象基础上的代码重用。继承是对许多问题中分层特性的一种自然描述,因而也是类的具体化和被重新利用的一种手段,它所表达的就是一种对象类之间的相交关系。它使得某类对象可以继承另外一类对象的特征和能力。继承所具有的作用有两个方面:一方面可以减少代码冗余;另一方面可以通过协调性来减少相互之间的接口和界面。通过继承方式定义的子类也称为派生类。
2.类的三种继承方式之间的区别是什么?
类的继承方式有public(公有)继承、protected(保护)继承和private(私有)继承三种。对于不同的继承方式,会导致基类成员原来的访问属性在派生类中有所变化。表5.1列出了不同继承方式下基类成员访问属性的变化情况。
表5.1 不同继承方式下基类成员的访问属性
说明:
该表第1列给出3种继承方式,第1行给出基类成员的3种访问属性。其余单元格内容为基类成员在派生类中的访问属性。
从表中可以看出:
(1) 基类的私有成员在派生类中均是不可访问的,它只能由基类的成员访问。
(2) 在公有继承方式下,基类中的公有成员和保护成员在派生类中的访问属性不变。
(3) 在保护继承方式下,基类中的公有成员和保护成员在派生类中均为保护的。
(4) 在私有继承方式下,基类中的公有成员和保护成员在派生类中均为私有的。
需要注意的是:
保护成员与私有成员唯一的不同是当发生派生后,处在基类protected区的成员可被派生类直接访问,而私有成员在派生类中是不可访问的。在同一类中私有成员和保护成员的用法完全一样。
3.派生类能否直接访问基类的私有成员?若否,应如何实现?
派生类不能直接访问基类的私有成员。
具体实现方式:(1) 在类定义体中增加保护段
为了便于派生类的访问,可以将基类私有成员中需提供给派生类访问的部分定义为保护段成员。保护段成员可以被它的派生类访问,但是对于外界是隐藏起来的。这样,既方便了派生类的访问,又禁止外界对它的派生类访问。
这种方式的缺点是在公有派生的情况下,如果把成员设为保护访问控制,则为外界访问基类的保护段成员提供了机会,而三种派生方式,我们经常使用的是公有派生。
(2) 将需访问基类私有成员的派生类成员函数声明为基类的友元
这样派生类中的其它成员函数均无权访问它,外界不可能通过派生新类来达到访问基类私有成员的目的。
4.派生类构造函数和析构函数的执行顺序是怎样的?在多继承中,派生类构造函数和析构函数的执行顺序又是怎样的?
构造函数的执行顺序:先祖先(基类)、再客人(对象成员),后自己(派生类本身)。
析构函数的执行顺序和构造函数正好严格相反:先自己(派生类本身),再客人(对象成员),后祖先(基类)。
在多个基类之间严格按照派生类定义时从左到右的顺序来排列先后。而析构函数的调用顺序刚好与构造函数的相反。
5.派生类的构造函数和析构函数的作用是什么?
在下面两种情况下,必须定义派生类的构造函数:派生类本身需要构造函数;在定义派生类对象时,其相应的基类对象需调用带有参数的构造函数。
派生类对象的初始化也是通过派生类的构造函数实现的。具体来说,就是对该类的数据成员赋初值。
派生类析构函数的功能与没有继承关系的类中析构函数的功能一样,也是在对象消亡之前进行一些必要的清理工作。
6.多继承一般应用在哪些场合?
对于多重继承,派生类可以有多个直接基类。这时的派生类同时得到了多个已有类的特征。
7.在类的派生中为何引入虚基类?在含有虚基类的派生类中,当创建它的对象时,构造函数的执行顺序如何?
当在多条继承路径上有一个公共的基类,在这些路径中的某几条路径汇合处,这个公共的基类就会产生多个实例(或多个副本),若想只保存这个基类的一个实例,可以将这个公共基类说明为虚基类。从基类派生新类时,使用关键字virtual可以将基类说明成虚基类。
在多个基类之间严格按照派生类定义时从左到右的顺序来排列先后。而析构函数的调用顺序刚好与构造函数的相反。如果基类中有虚基类,则构造函数的调用顺序采用下列规则:
(1) 虚基类的构造函数在非虚基类之前调用。
(2) 若同一层次中包含多个虚基类,这些虚基类的构造函数按照他们说明的次序调用;
(3) 若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数。
特别需要注意,当一个派生类同时有多个基类时,对于所有需要给予参数进行初始化的基类,都要显式给出基类名和参数表。对于使用默认构造函数的基类,可以不给出类名。同样,对于对象成员,如果是使用默认构造函数,也不需要写出对象名和参数表。而对于单继承,就只需要写一个基类名就可以了。
8.设计一个大学的类系统,学校中有学生、教师、职员,每种人员都有自己的特性,他们之间又有相同的地方。利用继承机制定义这个系统中的各个类及类上必须的操作。
参考程序:
#include
#include
class Person{
protected:
char m_strName[10];
int m_nSex;
int m_nAge;
public:
Person(char *name,int age,char sex){
strcpy(m_strName, name);
m_nSex= (sex=='m'?0:1 );
m_nAge = age;
}
void setName(char *name){
strcpy(m_strName, name);
}
void setSex(int sex){
m_nSex= (sex=='m'?0:1 );
}
void setAge(int age){
m_nAge = age;
}
char * getName(){
return m_strName;
}
int getAge(){
return m_nAge;
}
int getSex(){
return m_nSex;
}
void ShowMe(){
cout<<" 姓名:"< cout<<" 性别:"<<(m_nSex==0?"男":"女")< cout<<" 年龄:"< } }; class Teacher : public Person{ char m_strDept[20]; int m_fSalary; public: Teacher(char *name,int age,char sex,char *dept,int salary) :Person(name,age,sex){ strcpy(m_strDept, dept); m_fSalary = salary; } void ShowMe() { Person::ShowMe(); cout<<" 工作单位:"< cout<<" 月薪:"< } void setSalary(int salary){ m_fSalary = salary; } int getSalary(){ return m_fSalary; } }; class Student : public Person{ char m_strID[12]; char m_strClass[12]; public: Student(char *name,int age,char sex,char *ID,char *Class) :Person(name,age,sex){ strcpy(m_strID, ID); strcpy(m_strClass, Class); } void ShowMe(){ cout<<" 学号:"< Person::ShowMe(); cout<<" 班级:"< } void setID(char * ID){ strcpy(m_strID, ID); } void setClass(char *Class){ strcpy(m_strClass, Class); } char* getID(){ return m_strID; } char* getClass(){ return m_strClass; } }; class Employee:public Person{ int m_fSalary; public: Employee(char *name,int age,char sex,int salary) :Person(name,age,sex){ m_fSalary = salary; } void setSalary(int salary){ m_fSalary = salary; } int getSalary(){ return m_fSalary; } void ShowMe(){ Person::ShowMe(); cout<<" 工资:"< } }; void main(){ // 定义三个不同类的对象 Teacher teacher1("刘馨",38,'m',"计算机系",3800); Student std1("刘丽",20,'f',"03016003","计算机03"); Employee emPloyee1("张鑫",25,'f',1500); //显示各类人员的属性 teacher1.ShowMe(); cout<<"--------------------"< std1.ShowMe(); cout<<"--------------------"< emPloyee1.ShowMe(); //修改各类人员的属性 teacher1.setAge(40); teacher1.setSalary(4500); std1.setAge(21); emPloyee1.setAge(26); emPloyee1.setSalary(2000); cout<<"--------------------"< cout<<"修改各类人员的属性后:"< teacher1.ShowMe(); cout<<"--------------------"< std1.ShowMe(); cout<<"--------------------"< emPloyee1.ShowMe(); } 程序的执行结果为: 姓名:刘馨 性别:男 年龄:38 工作单位:计算机系 月薪:3800 ------------------- 学号:03016003 姓名:刘丽 性别:女 年龄:20 班级:计算机03 ------------------- 姓名:张鑫 性别:女 年龄:25 工资:1500 ------------------- 修改各类人员的属性后: 姓名:刘馨 性别:男 年龄:40 工作单位:计算机系 月薪:4500 ------------------- 学号:03016003 姓名:刘丽 性别:女 年龄:21 班级:计算机03 ------------------- 姓名:张鑫 性别:女 年龄:26 工资:2000 9. 假定车可分为货车和客车,客车又可分为轿车、面包车和公共汽车。请设计相应的类层次结构。 说明:可以把轿车、面包车和公共汽车定义为客车类的对象 参考程序: #include using namespace std; class vehicle // 定义基类vehicle { public: // 公有函数成员 vehicle(int in_wheels,float in_weight); // 给数据成员初始化 int get_wheels(); // 获取车轮数 float get_weight(); // 获取汽车重量 void setWeels(int wls); void setWeight(float wt); void display(){ cout<<"车轮数:"< <<"汽车重量:"< } private: // 私有数据成员 int wheels; // 车轮数 float weight; // 表示汽车承重 }; vehicle::vehicle(int in_wheels,float in_weight){ wheels = in_wheels; weight = in_weight; } float vehicle::get_weight(){ return weight; } int vehicle::get_wheels(){ return wheels; } void vehicle::setWeels(int wls){ wheels = wls; } void vehicle::setWeight(float wt){ weight = wt; } class truck:public vehicle // 定义货车类truck { private: // 新增私有数据成员 float weight_load; // 承重 public: // 新增公有成员函数 truck(int wheel,float wt,float wl):vehicle(wheel,wt){ weight_load = wl; } float getLoads(){ return weight_load; } void display(){ vehicle::display(); cout<<"汽车承重"< } }; //车和客车,客车又可分为轿车、面包车和公共汽车 class car:public vehicle // 定义客车类car { int passenger_load; // 新增私有数据成员,表示载客数 public: // 新增公有成员函数 car(int in_wheels,float in_weight,int people=4):vehicle(in_wheels,in_weight) { passenger_load = people; } int getPassengers(){ return passenger_load; } void setPassengers(int people){ passenger_load = people; } void display(){ vehicle::display(); cout<<"载客数:"< } }; void main(){ truck truck1(8,400,100000); // 货车 car car1(4,20); // 客车 car saloon_car(4,10,5); // 轿车 car microbus(6,10,18); // 面包车 car bus(6,20,30); // 公共汽车 // 显示相关信息 truck1.display(); cout<<"---------------------"< car1.display(); cout<<"---------------------"< saloon_car.display(); cout<<"---------------------"< microbus.display(); cout<<"---------------------"< bus.display(); } 程序的运行结果: 车轮数:8 汽车重量:400 汽车承重100000 --------------------- 车轮数:4 汽车重量:20 载客数:4 --------------------- 车轮数:4 汽车重量:10 载客数:5 --------------------- 车轮数:6 汽车重量:10 载客数:18 --------------------- 车轮数:6 汽车重量:20 载客数:30 10.设计一个能细分为矩形、三角形、圆形和椭圆形的“图形”类。使用继承将这些图形分类,找出能作为基类部分的共同特征(如宽、高、中心点等)和方法(如初始化、求面积等),并看看这些图形是否能进一步划分为子类。 参考程序: #include using namespace std; class Figure // 定义基类图形类 { public: // 公有函数成员 Figure(int wid){width = wid;} float area(){} int getWidth(){return width;} private: // 私有数据成员 int width; // 宽度或半径 }; class Rectangle:public Figure{ // 定义矩形类 int height; public: Rectangle(int wid, int hei):Figure(wid){ height = hei; } float area(){return getWidth() * height;} }; class Triangle:public Figure{ // 定义三角形类 int height; public: Triangle(int wid, int hei):Figure(wid){ height = hei; } float area(){return 1.0/2* getWidth() * height;} }; class Circle:public Figure{ // 定义圆类 public: Circle(int wid):Figure(wid){ } float area(){return 3.14 * getWidth() * getWidth();} }; void main(){ Rectangle rect(5,4); Triangle tri(5,4); Circle cir(5); cout<<"矩形的面积是:"< <<"三角形的面积是:"< <<"圆的面积是:"< } 程序的运行结果为: 矩形的面积是:20 三角形的面积是:10 圆的面积是:78.5 11.考虑大学的学生情况,试利用单继承来实现学生和毕业生两个类,设计相关的数据成员及函数,编程对继承情况进行测试。 参考程序: #include #include class Student // 定义基类vehicle { public: // 公有函数成员 Student(int n,char *na,int g):number(n),grade(g){ strcpy(name,na); } int getNumber(){ return number; } char * getName(){ return name; } int getGrade(){ return grade; } void display(){ cout<<"学号:"< <<"姓名:"< <<"年级:"< } private: // 私有数据成员 int number; // 学号 char name[20]; // 姓名 int grade; // 年级 }; class Graduate:public Student{ //定义毕业生类 char designSubject[20]; public: Graduate(int n,char *na,char * deSub,int g=4):Student(n,na,g) { strcpy(designSubject,deSub);} void display(){ Student::display(); cout<<"设计题目:"< } }; void main(){ //创建对象 Student li(2,"Li Ming",3); Graduate zhang(3,"Zhang Gang","学生成绩管理系统"); // 显示对象的相关信息 li.display(); cout << endl<<"-----------------------------------" < zhang.display(); } 程序的运行结果: 学号:2 姓名:Li Ming 年级:3 ----------------------------------- 学号:3 姓名:Zhang Gang 年级:4 设计题目:学生成绩管理系统 12. 定义一个哺乳动物类,再由此派生出人类、狗类和猫类,这些类中均有speak()函数,观察在调用过程中,到底使用了谁的speak()函数。 参考程序: #include #include class Animal{ float weight; public: void speak(){} void setWeight(float wt){weight = wt;} float getWeight(){return weight;} }; class Human:public Animal{ public: void speak(){ cout<<"说话"< } }; class Cat:public Animal{ public: void speak(){ cout<<"喵喵"< } }; class Dog:public Animal{ public: void speak(){ cout<<"汪汪"< } }; void main(){ // 定义三个对象 Human hm; Cat cat; Dog dog; // 调用不同类的speak函数 cout<<"人:"; hm.speak(); cout<<"猫:"; cat.speak(); cout<<"狗:"; dog.speak(); } 程序的运行结果: 人:说话 猫:喵喵 狗:汪汪 13. 通过多重继承定义研究生类,研究生既有学生的属性,又有教师的属性。 参考程序: #include #include class Person{ protected: char m_strName[10]; int m_nSex; public: Person(char *name,int age,char sex){ strcpy(m_strName, name); m_nSex= (sex=='m'?0:1 ); m_nAge = age; } void setName(char *name){ strcpy(m_strName, name); } void setSex(int sex){ m_nSex= (sex=='m'?0:1 ); } void setAge(int age){ m_nAge = age; } char * getName(){ return m_strName; } int getAge(){ return m_nAge; } int getSex(){ return m_nSex; } void ShowMe(){ cout<<"姓名:"< cout<<"性别:"<<(m_nSex==0?"男":"女")< cout<<"年龄:"< } }; class Teacher : public Person{ char m_strDept[20]; public: Teacher(char *name,int age,char sex,char *dept,int salary) :Person(name,age,sex){ strcpy(m_strDept, dept); m_fSalary = salary; } void ShowMe() { Person::ShowMe(); cout<<"工作单位:"< cout<<"月薪:"< } void setSalary(int salary){ m_fSalary = salary; } char * getDept(){ return m_strDept; } int getSalary(){ return m_fSalary; } }; class Student : public Person{ char m_strID[12]; char m_strClass[12]; public: Student(char *name,int age,char sex,char *ID,char *Class) :Person(name,age,sex){ strcpy(m_strID, ID); strcpy(m_strClass, Class); } void ShowMe(){ cout<<"学号:"< Person::ShowMe(); cout<<"班级:"< } void setID(char * ID){ strcpy(m_strID, ID); } void setClass(char *Class){ strcpy(m_strClass, Class); } char* getID(){ return m_strID; } char* getClass(){ return m_strClass; } }; class Master:public Student, public Teacher{ public: Master(char *name,int age,char sex,char *ID,char *Class,char *dept,int salary) :Student(name,age,sex,ID,Class),Teacher(name, age, sex, dept, salary){ } void ShowMe(){ Student::ShowMe(); cout<<"工作单位:"< cout<<"月薪:"< } }; void main(){ // 定义三个不同类的对象 Teacher teacher1("刘馨",38,'m',"计算机系",3800); Student std1("刘丽",20,'f',"03016003","计算机03"); Master master("张鑫",25,'f',"003","机械052","机械系",1000); //显示各类人员的属性 teacher1.ShowMe(); cout<<"--------------------"< std1.ShowMe(); cout<<"--------------------"< master.ShowMe(); } 程序的运行结果为: 姓名:刘馨 性别:男 年龄:38 工作单位:计算机系 月薪:3800 -------------------- 学号:03016003 姓名:刘丽 性别:女 年龄:20 班级:计算机03 -------------------- 学号:003 姓名:张鑫 性别:女 年龄:25 班级:机械052 工作单位:机械系 月薪:1000 《面向对象程序设计C++》期末考试试卷(B) 一、单项选择题(每小题2分,共40分) 1、关于C++与C语言关系的描述中,()是错误的。 A.C语言是C++语言的一个子集B.C语言与C++语言是兼容的 C.C++语言对C语言进行了一些改进D.C++语言和C语言都是面向对象的 2、已知:int m=10; 下列表示引用的方法中,()是正确的。 A.int &x=m; B.int &y=10; C.int &z; D.float &t=&m; 3、考虑下面的函数原型声明:void testDefaulParam(int a,int b=7,char z='*'); 下面函数调用中,不合法的是()。 A.testDefaulParam(5); B.testDefaulParam(5,8); C.testDefaulParam(5,'#'); D.testDefaulParam(0,0,'*'); 4、系统在调用重载函数时往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是()。 A.函数的返回值类型B.参数的类型C.函数名称D.参数个数 5、下列有关C++类的说法中,不正确的是()。 A.类是一种用户自定义的数据类型 B.只有类中的成员函数或类的友元函数才能存取类中的私有成员 C.在类中,如果不做特别说明,所有成员的访问权限均为私有的 D.在类中,如果不做特别说明,所有成员的访问权限均为公用的 6、已知X类,则当程序执行到语句X array[3];时,调用了()次构造函数。 A.0 B.1 C.2 D.3 7、有关析构函数的说法,不正确的是()。 A.析构函数有且仅有一个 B.析构函数和构造函数一样可以有形参 C.析构函数的功能是在系统释放对象之前作一些内存清理工作 D.析构函数无任何函数类型 一、填空题(每空1分,共14分) 1、观看以下程序: class point{ public: void show() {cout<<”point”< (A)指针(B)引用(C)枚举(D)结构 3、类成员的访问权限中,()只能被本类的成员函数和其友元函数访问。 (A)share (B)public (C)private (D)protected 4、关于构造函数,下列说法不正确的是()。 (A)构造函数名字和类名相同 (B)构造函数在创建对象时自动执行 (C)构造函数无任何函数返回类型 (D)构造函数有且只有一个 5、派生类可以访问其基类的()。 (A)公有成员(B)保护成员 (C)私有派生(D)公有和保护成员 6、下列关于运算符重载的描述中,错误的是()。 (A)运算符重载不可以改变操作数的个数 (B)运算符重载不可以改变运算符的功能 (C)运算符重载不可以改变结合方向 (D)运算符重载不可以改变运算优先级 7、C++语言是从早期的C语言逐渐发展演变而来的.与C语言相比,它在求解问题方法上进行的最大改进是() (A)面向过程(B)面向对象(C)安全性(D)复用性 8、对于类中定义的成员,其隐含访问权限为()。 A.public B.protected C.private D.static 9、下面有关重载函数的说法中正确的是() (A)重载函数必须具有不同的返回值类型;(B)重载函数形参个数必须不同; (C)重载函数必须有不同的形参列表(D)重载函数名可以不同; 10、有如下的对类“CSample”的说明,其中()是错误的。 class CSample { A.int a=23; B.CSample(); public: C.CSample(int val); D.~ CSample(); 11、在int a=3,int *p=&a;中,*p的值是( ) A.变量a的地址值 B.无意义 C.变量p的地址值 D.3 12、每个类()构造函数。 (A)只能有一个(B)只可有公有的 1 什么是面向对象程序设计,它与传统的结构式程序有什么不同。 面向对象程序设计是一种适用于设计、开发各类软件的范型。它是将软件看成是一个由对象组成的社会:这些对象具有足够的智能,能理解从其他对象接受的信息,并以适当的行为作出响应;允许低层对象从高层对象继承属性和行为。通过这样的设计思想和方法,将所模拟的现实世界中的事物直接映射到软件系统的解空间。 与传统的结构式程序设计相比,面向对象程序设计吸取了结构式程序设计的一切优点(自顶向下、逐步求精的设计原则)。而二者之间的最大差别表现在: ·面向对象程序采用数据抽象和信息隐藏技术使组成类的数据和操作是不可分割的,避免了结构式程序由于数据和过程分离引起的弊病。 · 面向对象程序是由类定义、对象(类实例)和对象之间的动态联系组成的。而结构式程序是由结构化的数据、过程的定义以及调用过程处理相应的数据组成的 2 用面向对象方法建立模型的思维过程是怎样的。 用面向对象方法建立拟建系统的模型的过程就是从被模拟现实世界的感性具体中抽象要解决的问题概念的过程。这种抽象过程分为知性思维和具体思维两个阶段,其中:·知性思维是从感性材料中分解对象,抽象出一般规定,形成了对对象的普遍认识。·具体思维是从知性思维得到出的一般规定中揭示的事物的深刻本质和规律,其目的是把握具体对象的多样性的统一和不同规定的综合。 3 解释以下概念: ①对象:在现实世界中,对象就是可以感觉到的实体。每个对象具有一个特定的名字以 区别于其他对象;具有一组状态用来描述它的某些特性;具有一组操作,每一个操作决定对象的一种功能或行为(为自身服务的操作和为其他对象提供服务的操作)。而在面向对象系统中,对象是可以标识的存储区域。每个对象的状态被保存在此区域中,而实现一类对象行为的操作(代码)被保存在另外相关的存储器区域中。 ②消息:消息是要求某个对象执行其某种功能操作(方法)的规格说明。因此,消息是 由消息的接收者、消息要求提供的操作(消息名)和必要的参数组成的。 ③类:在现实世界中,类是对一组具有共同特性(属性和行为)的客观对象的抽象。而 在面向对象系统中,类是由程序员自定义的具有特定结构和功能的类型,是一种代码共享的手段。 ④实例:任何一个对象都是该对象所属类的一个具体实例。 ⑤公有消息:是由对象外向对象发送的消息,用于激活该对象的某种方法。 ⑥私有消息:是由对象向自身发送的消息,用于内部操作;该类消息不能从对象外向该 对象发送。 ⑦消息序列:在面向对象系统中一个事件的发生总会有多个对象的多次相互作用才能完 成,使得这些对象能够相互作用的消息组成的序列被称为消息序列。 4 类与实例的关系如何? 类是创建对象的模板,而对象是实现类的实例。属于同一类的不同实例必须具有: ·相同的操作集合; ·相同的静态属性集合; ·不同的对象名和属性动态值。 第3章面向对象程序设计基础 第3章面向对象程序设计基础 【1】什么是Java程序使用的类?什么是类库? 答:类是将一类事物的特性描述出来,然后如果用这个类来定义对象,则该对象就拥有了这个类所描述的所有特性。 在Java系统中,系统定义好的类根据实现的功能不同,可以划分成不同的集合,每个集合称为一个包,所有包合称为类库。 【2】如何定义方法?在面向对象程序设计中方法有什么作用? 答:方法的定义由两部分组成:方法声明和方法体。 方法的声明如下: 返回值类型方法名(参数类型形式参数1,参数类型形式参数2…){ 程序代码; 返回值; } 在面向对象程序设计中,方法的作用是完成对类和对象属性操作。 【3】简述构造方法的功能和特点。下面的程序片段是某学生为student类编写的构造方法,请指出其中的错误。 void Student(int no,String name) { studentNo=no; studentName=name; return no; } 答:构造方法的功能是:构造方法是一个特殊的方法,主要用于初始化新创建的对象; 特点:构造方法的方法名要求与类名相同,用户不能直接调用,只能通过new运算符调用,而且构造方法是不返回任何数据类型,甚至也不返回void数据类型,即不能在构造方法前加void。 错误之处:(1)构造方法Student()前不能加void,(2)不能用return语句,(3)类名Student 首字母S改成小写s. 【4】定义一个表示学生的student类,包括的域有学号、姓名、性别、年龄,包括的方法有获得学号、姓名、性别、年龄及修改年龄。编写Java程序创建student类的对象及测试其方法的功能。 class Student { String id; String name; String sex; int age; void talk(){《面向对象程序设计C 》期末试卷及标准答案
c面向对象程序设计试题和答案(经典题目)
什么是面向对象程序设计
第3章 面向对象程序设计基础
《面向对象程序设计》答案