C继承与派生
- 格式:docx
- 大小:29.93 KB
- 文档页数:12
第4章继承与派生一、简答题1. 有以下程序结构,请分析访问属性。
class A //A为基类{public:void func1( );int i;protected:void func2( );int j;private:int k;} ;class B: public A //B为A的公用派生类{public :void func3( ) ;protected:int m;private :int n;};class C: public B // C为B的公用派生类{public:void func4( );private:int p;};int main( ){ A a; //a是基类A的对象B b; //b是派生类B的对象C c; //c是派生类C的对象return 0;}问:(1)在main函数中能否用b.i,b.j 和b.k 访问派生类B对象b中基类A的成员?(2)派生类B中的成员函数能否调用基类A中的成员函数func1和func2?(3)派生类B中的成员函数能否访问基类A中的数据成员i,j,k?(4)能否在main函数中用c.i,c.j,c.k,c.m,c.n,c.p访问基类A的成员i,j,k,派生类B的成员m,n,以及派生类C的成员p?(5)能否在main函数中用c. func1( ),c. func2( ),c. func3( )和c. func4( )调用func1,func2,func3,func4成员函数?(6)派生类C的成员函数func4能否调用基类A中的成员函数func1,func2和派生类B中的成员函数func3?【答案要点】各成员在各类的范围内的访问权限如下表:(1)在main 函数中能用b.i访问派生类B对象b中基类A的成员i,因为它在派生类B中是公用数据成员。
不能用b.j访问派生类B对象b中基类A的成员j,因为它在派生类B中是保护数据成员,不能被类外访问。
不能用b.k访问派生类B对象b中基类A的成员k,因为它是基类A的私用数据成员,只有基类A的成员函数可以访问,不能被类外访问。
(2)派生类B中的成员函数能调用基类A中的成员函数func1和func2,因为func1、func2在派生类B中是公用成员和保护成员,可以被派生类的成员函数访问。
(3)派生类B中的成员函数能访问基类A中的数据成员i、j,因为i、j在派生类B中是公用成员和保护成员,可以被派生类的成员函数访问。
派生类B中的成员函数不能访问基类A中的数据成员k,因为它在派生类B中是不可访问的成员。
(4)能在main 函数中用c.i访问基类A的成员i,不能用c.j、c.k访问基类A的成员j、k,因为它们在派生类C中是保护成员和私有成员,不能被类外访问。
也不能用c.m、c.n 访问派生类B的成员m、n,因为它们在派生类C中也是保护成员和私有成员,不能被类外访问。
也不能用c.p访问派生类C中的私用成员p。
(5)能在main函数中用c.func1()、c. func3()和c. func4()调用func1、func3、func4成员函数,因为它们在派生类C中是公用成员函数,可以在类外被访问。
不能在main函数中用c.func2()调用func2成员函数,因为它在派生类C中是保护成员函数,不能在类外被访问。
(6)派生类C的成员函数func4能调用基类A中的成员函数func1、func2和派生类中的成员函数func3,因为func1、func3在派生类C中是公用成员函数,func2在派生类C中是保护成员函数,都可以被派生类C的成员函数调用。
2. 已给商品类及其多层的派生类。
以商品类为基类。
第一层派生出服装类、家电类、车辆类。
第二层派生出衬衣类、外衣类、帽子类、鞋子类;空调类、电视类、音响类;自行车类、轿车类、摩托车类。
请给出商品类及其多层派生类的基本属性和派生过程中增加的属性。
【答案要点】按题意没有操作,所以只列出各个类的数据成员,也不再在main函数中对各类进行测试。
#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 ElectricAppliance:public Commodity{ //家电类enum {Black,White}type; //黑白家电};class Vehicle:public Commodity{ //车辆类int wheelNum; //车轮数量};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 AirCondition:public ElectricAppliance{//空调bool warmCool; //是否冷暖float power; //功率};class Television:public ElectricAppliance{//电视类int size; //尺寸bool isColor; //是否彩色};class Acoustics:public ElectricAppliance{//音响类int speakerNum; //喇叭数目float power; //功率};class Bicycle:public Vehicle{//自行车类int speedGrades; //调速级数int wheelSize; //轮子大小};class Car:public Vehicle{//轿车类float volume; //排气量bool isSkyLight; //是否有天窗int boxNum; //厢数};class Motorcycle:public Vehicle{//摩托车类float volume; //排气量};int main(){ return0; }二、编程题1.定义一个国家基类Country,包含国名、首都、人口等属性,派生出省类Province,增加省会城市、人口数量属性。
【程序参考代码】#include<iostream>using namespace std;#include<string>class Country{public:Country(char *n,char *c,double p){ strcpy(name,n); strcpy(capital,c); population=p; }void print(){ cout<<name<<","<<capital<<","<<population<<endl; }private:char name[10],capital[50];double population;};class Province:private Country{public:Province(char *n,char *c,double p,char *cc,double pp):Country(n,c,p){ strcpy(provinceCapital,cc); provincePopulation=pp; }void display(){ print();cout<<provinceCapital<<","<< provincePopulation<<endl;}private:char provinceCapital[50];double provincePopulation;};int main(){Province p("China","Beijing",1.36e+010,"guang dong",1.05e+009);p.display();return 0;}2.定义一个基类——Person类,有姓名、性别、年龄,再由基类派生出学生类——Student 类和教师类——Teacher类,学生类增加学号、班级、专业和入学成绩,教师类增加工号、职称和工资。
【程序参考代码】#include <iostream>#include <string>using namespace std;class Person //声明公共基类Person {public:void set(){ cin >>name>>sex>>age; } //姓名、性别、年龄的输入void display(){ cout<<"name="<<name<<"\tsex="<<sex<<"\tage="<<age; }//姓名、性别、年龄的显示private:string name; //姓名char sex; //性别int age;//年龄};class Student: public Person //声明Student类为Person类的公用派生类{public:void input(){ Person::set();//姓名、性别、年龄的输入cin>>stuId>>stuClass>>profession>>score;//学号、班级、专业、入学成绩的输入}void display(){ Person::display();//姓名、性别、年龄的显示cout<<"\tstuId="<<stuId<<"\tstuClass="<<stuClass<<"\tprofession ="<<profession<<"\tscore="<<score<<endl<<endl;//学号、班级、专业、入学成绩的显示}private:stringstuId;//学号string stuClass; //班级string profession; //专业float score;//入学成绩};class Teacher: public Person //声明Teacher类为Person类的公用派生类{public:void set(){ Person::set();//姓名、性别、年龄的输入cin>> teachId >> title >> wage;//工号、职称、工资的输入}void display(){ Person::display(); //姓名、性别、年龄的显示cout<<"\tteachId="<<teachId<<"\ttitle="<<title<<"\twage="<<wage<<endl;//工号、职称、工资的显示}private:stringteachId;//工号string title; //职称float wage; //工资};int main( ){Student student;Teacher teacher;cout<<"Please enter student's name,sex,age,stuId,stuClass,profession and score:"<<endl;student.input();cout<<"Display student's name,sex,age,stuId,stuClass,profession and score:"<<endl;student.display();cout<<"Please enter teacher's name,sex,age,teachId, title and wage:"<<endl; teacher.set();cout<<"Display teacher's name,sex,age,teachId, title and wage:"<<endl;teacher.display();return 0;}3.设计一个基类——Building类,有楼房的层数、房间数和总面积,再由基类派生出教学楼——TeachBuilding类和宿舍楼类——DormBuilding类,教学楼类增加教室数,宿舍楼类增加宿舍数、容纳学生总人数。