1520408

练习15.18:

假设给定了第543页和第544页的类,同时已知每个对象的类型如注释所示,判断下面的哪些赋值语句是合法的。解释那些不合法的语句为什么不被允许:

Base *p = &dl;  // dl的类型是Pub_Derv
P = &d2;    // d2的类型是Priv_Derv
p =&d3;    // d3的类型是Prot_Derv
p =&ddl;     // ddl 的类型是 Derived__from_Publie
p =&dd2; // dd2 的类型是 Derived_from_Private
p = &dd3; // dd3 的类型是 Derived_from_Protected

【出题思路】

熟悉不同说明符导致基类与派生类间的不同访问控制。

【解答】

只有dl和ddl才能够赋值。这是因为:只有当派生类公有地继承基类时,用户代码才能使用派生类向基类的转换;也就是说,如果派生类继承基类的方式是受保护的或者私有的,则用户代码不能使用该转换。在题中,只有dl和ddl类是公有的继承基类,故只有它们才能完成向基类的转换。

练习15.19:

假设543页和544页的每个类都有如下形式的成员函数:

void memfen(Base &b) { b = *this; }

对于每个类,分别判断上面的函数是否合法。

【出题思路】

熟悉继承的各种运用情况。

【解答】

Derived from Private : private Priv Derv 这个类的函数不合法。

原因如下:

1. 无 论 派 生 类 以 什 么 方 式 继 承 基 类 , 派 生 类 的 成 员 函 数 和 友 元 都 能 使 用 派 生 类向基类的转换;派生类向其直接基类的类型转换对于派生类的成员和函数来说永远是可访问的。

2 .如果派生类继承基类的方式是公有的或者受保护的,则派生类的成员和友元可以使用派生类向基类的类型转换;反之,如果派生类继承基类的方式是私有的,则不能使用。

练习15.20:

编写代码检验你对前面两题的回答是否正确。

【出题思路】

实际编程练习,判断继承运用是否掌握。

【解答】

#include <iostream>
using namespace std;
class Base{
public:
	void pub_mem();
protected:
	int prot_mem;
private:
	char priv_mem;
};
struct Pub_Derv:public Base
{           
	int f1() {return prot_mem;}
	void memfcn(Base &b)
	{
		b=*this;
		cout<<"Pub_Derv" <<endl;
	}               
};
struct Priv_Derv:private Base
{           
	int f1() const {return prot_mem;}
	void memfcn(Base &b)
	{
		b=*this;
		cout<<"Priv_Derv"<<endl;
	}
};
struct Prot_Derv:protected Base{
	int f2(){return prot_mem;}
	void memfcn(Base &b)
	{
		b=*this;
		cout<<"Prot_Derv"<<endl;
	}                    
};
struct Derived_from_Public :public Pub_Derv
{                   
	int use_base(){return prot_mem;}
	void memfcn(Base &b)
	{
		b=*this;
		cout<<"Derived_from_Public"<<endl;
	}                       
};
struct Derived_from_Protected:protected Prot_Derv
{
	int use_base(){
		return prot_mem;
	}
	void memfcn (Base &b){
		b=*this;
		cout<<"Derived_from_Protected"<<endl;
	}
};
int main(int argc, const char * argv[]){
	Pub_Derv dl;
	Priv_Derv d2;
	Prot_Derv d3;
	Derived_from_Public ddl;
	// Derived_from_Private dd2;
	Derived_from_Protected dd3;
	Base base;
	Base *p=new Base;
	p=&dl;                      // dl的类型是Pub_Derv
	//p=&d2;                    // d2 的类型是 Priv_Derv
	//p=&d3;                    // d3 的类型是 Proti_Derv
	p=&ddl;                     // ddl 的类型是 Derived_from_Public
	//p=&dd2;                   // dd2 的类型是 Derived_from_Private
	//p=&dd3;                   // dd3 的类型是 Derived_from_Protected
	dl.memfcn(base);
	d2.memfcn(base);
	d3.memfcn(base);
	ddl.memfcn(base);
	// dd2.memfcn(base);
	dd3.memfcn(base);
	return 0;
}
/*代码运行结果:
Pub_Derv
Priv_Derv
Prot_Derv
Derived_from_Public
Derived from Protected
*/

本页共124段,4082个字符,5324 Byte(字节)