面向对象程序设计课后习题答案

发布时间 : 星期四 文章面向对象程序设计课后习题答案更新完毕开始阅读

}

main()

{ shang_stock shanghai(1600,20,10);//建立对象

//表示上海有1600支股票,20支ST股票,10支PT股票 shen_stock shenzhen(1500,15,8); //建立对象

//表示深圳有1500支股票,15支ST股票,8支PT股票 shang_count(shanghai);//计算上海的股票总数 shen_count(shenzhen);//计算深圳的股票总数

count(shanghai,shenzhen);//计算上海和深圳的股票总数 return 0; }

void shang_count(const shang_stock ss)//计算上海的股票总数 { int s;

cout<<\}

void shen_count(const shen_stock es)//计算深圳的股票总数

{ cout<<\void count(const shang_stock ss,const shen_stock es)

//计算上海和深圳的股票总数 { int s;

s=es.general+es.st+es.pt+ss.general+ss.st+ss.pt;

cout<<\}

第五章:继承与派生类

[5_1]答:类的继承方式有public(公有继承)、protected(保护继承)和private(私有继承)3种,不同的继承方式导致原来具有不同访问属性的基类成员在派生类中的访问属性也有所不同。 (1)基类中的私有成员 无论哪种继承方式,基类中的私有成员不允许派生类继承,即在派生类中是不可直接访问的。 (2)基类中的公有成员

当类的继承方式为公有继承时,基类中的所有公有成员在派生类中仍以公有成员的身份出现;当类的继承方式为私有继承时,基类中的所有公有成员在派生类中都以私有成员的身份出现;当类的继承方式为保护继承时,基类中的所有公有成员在派生类中都是以保护成员的身份出现。 (3)基类中的保护成员

当类的继承方式为公有继承时,基类中的所有保护成员在派生类中仍以保护成员的身份出现;当类的继承方式为私有继承时,基类中的所有保护成员在派生类中都是以私有成员的身份出现:当类的继承方式为保护继承时,基类中的所有保护成员在派生类中仍以保护成员的身份出现。

[5_2]答:派生类不能直接访问基类的私有成员,但是可以通过基类提供的公有 成员函数间接地访问基类的私有成员

[5_3]答:保护成员可以被派生类的成员函数访问,但是对于外界是隐藏起来的,外部函数不能访问它。因此,为了便于派生类的访问,可以将基类私有成员中需要提供给派生类访问的成员定义为保护成员。C++规定,派生类对于保护成员的继承与公有成员的继承很相似,也分为两种情况:若为公有派生,则基类中的保护成员在派生类中也为保护成员;若为私有派生,则基类中的保护成员在派生类中成为私有成员。

[5_4]答:通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数;当撤消派生类对象时,则先执行派生类的析构函数函数,随后再执行基类的析构函数。

[5_5]答:当基类的构造函数没有参数或没有显示定义构造函数时,派生类可以

不向基类传递参数,甚至可以不定义构造函数。当基类含有带参数的构造函数时,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径。 派生类构造函数的一般格式如下: 派生类构造函数名(参数表):基类构造函数名(参数表) { }

其中基类构造函数的参数,通常来源于派生类构造函数的参数表,也可以用常数值。由于析构函数是不带参数的,在派生类中是否定义析构函数与它所属的基类无关,基类的析构函数不会因为派生类没有析构函数而得不到执行,它们各自是独立的。

[5_6]答:当一个派生类具有多个基类时,这种派生方法称为多继承。多继承构造函数的执行顺序与单继承构造函数的执行顺序相同,也是遵循先执行基类的构造函数,再执行对象成员的构造函数,最后执行派生类构造函数的原则。在多个基类之间则严格按照派生类声明时从左到右的顺序来排列先后。而析构函数的执行顺序刚好与构造函数的执行顺序相反。 [5_7]在类的派生中为何要引入虚基类?虚基类构造函数的调用顺序是如何规定的?

当引用派生类的成员时,首先在派生类自身的作用域中寻找这个成员,如果没有找到,则到它的基类中寻找。如果一个派生类是从多个基类派生来的,而这些基类又有一个共同的基类,则在这个派生类中访问这个共同的基类中的成员时,可能会产生二义性。为了解决这种二义性,C++引入了虚基类的概念。 虚基类构造函数的调用顺序是: (1)若同一层次中包含多个虚基类,这些虚基类的构造函数按它们的说明的先后次序调用。 (2)若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数。

(3)若同一层次中同时包含虚基类和非虚基类,应先调用虚基类的构造函数,再调用非虚基类的构造函数,最后调用派生类构造函数。 [5_8]答:A

[5_9]答:C 说明:C++中继承方式有3种:私有继承、保护继承和公有继承。 [5_10]答:C

[5_11]答:C 说明:set_price()和print_price()在派生类中是私有成员函数,不能被派生类对象直接访问,所以A和D是错误的。code是私有数据成员,不能直接存取,所以B也是错误的。

[5_12]答:B 说明:code是私有数据成员,不能直接存取,所以B是错误的。 [5_13]答:运行结果是: Person Name=Angel Student Name=Angel Employee Name=Angel SideLine Name=Angel 说明:(1)从结果看出,程序中的虚基类Person的构造函数只执行了一次。当类SideLine的构造函数调用了虚基类Person的构造函数之后,类Student和类Employee对类SideLine的构造函数的调用被忽略了,这是初始化虚基类和非虚基类不同的地方。(2)多重继承的构造函数执行顺序遵循先执行基类的构造函数,再执行对象成员的构造函数,最后执行派生类构造函数的原则。

[5_14]运行结果是:40 50 10 20 30 40 50 60 [5_15]修改后的程序如下: #include #include class table { protected: int i,j; public:

table(int p,int q) { i=p; j=q; } void ascii(void); };

void table::ascii(void) { int k=1; for(;i

{ cout<

cout<<\ k++; }

cout<<\}

class der_table:public table { protected: char *c; public:

der_table(int p,int q,char *m):table(p,q) { c=m; }

void print(void); };

void der_table::print(void) { cout<

void main()

{ der_table ob('a','z',\ ob.print(); }

[5_16]程序编制如下: #include #include class time { public:

time(int h,int m,int s) { hours=h; minutes=m; seconds=s; }

virtual void display()

{ cout<

int hours,minutes,seconds; };

class date { public:

date(int m,int d,int y) { month=m; day=d; year=y; }

virtual void display()

{ cout<

int month,day,year; };

class birthtime:public time,public date//加此类 { public:

birthtime(char *cn,int mm,int dd,int yy,int hh,int mint,int ss) :time(hh,mint,ss),date(mm,dd,yy) { strcpy(childname,cn); } void display()

{ cout<

联系合同范文客服:xxxxx#qq.com(#替换为@)