当前位置:首页 > C++继承与派生
第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?
【答案要点】各成员在各类的范围内的访问权限如下表:
类的范围 基类A 公用派生类B 公用派生类C func1 公用 公用 公用 i 公用 公用 公用 func2 保护 保护 保护 j 保护 保护 保护 k 私有 不可访问 不可访问 func3 公用 公用 m 保护 保护 n 私有 不可访问 func4 公用 p 私有 (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
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
#include
Country(char *n,char *c,double p)
{ strcpy(name,n); strcpy(capital,c); population=p; }
void print(){ cout< 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< private: char provinceCapital[50]; double provincePopulation; }; int main() { Province p(\ p.display(); return 0; } 2.定义一个基类——Person类,有姓名、性别、年龄,再由基类派生出学生类——Student类和教师类——Teacher类,学生类增加学号、班级、专业和入学成绩,教师类增加工号、职称和工资。 【程序参考代码】 #include class Person //声明公共基类Person {public: void set(){ cin >>name>>sex>>age; } //姓名、性别、年龄的输入 void display(){ cout<<\ //姓名、性别、年龄的显示 private: string name; //姓名 char sex; //性别 int age;//年龄 }; class Student: public Person //声明Student类为Person类的公用派生类 {public: void input() { Person::set();//姓名、性别、年龄的输入
共分享92篇相关文档