十八章课后习题答案

//18.1
(a)类型是range_error
(b)被抛出的异常对象是对指针p解引用的结果,类型与p的静态类型相同,为exception
若写成throw p,则异常对象是exception*
//18.2
在释放资源前发生了异常,导致内存泄漏
//18.3
方法一
将可能发生异常的代码放在try中,捕获异常后进行释放
void exercise(int *b, int *e)
{
	vector<int> v(b, e);
	int *p = new int[v.size()];
	try
	{
		ifstream in("ints");
		//error
	}
	catch
	{
		delete p;
		//...
	}
}
方法二
定义一个类来封装数组的分配和释放,因为析构函数总会被执行
//18.4
这里的三个异常都因为继承关系而相关
runtime_error继承exception,overflow_error继承runtime_error
所以catch子句应该从最低派生类型到最高派生类型排序,这样派生类的处理代码能在基类之前处理派生类独有的东西
try{
	...
} catch(overflow_error eObj)
{
	...
} catch(const runtime_error &re)
{
	...
} catch(exception)
{
	...	
}
//18.5
int main()
{
	try
	{
		...
	} catch(const exception &e)
	{
		cerr << e.what() << endl;
		abort();
	}
}
//18.6
(a)throw new exceptionType();
(b)throw 1234;
(c)throw 1234;
//18.21
(b)List继承了两次
//18.22
先执行A的构造函数,然后执行B的构造函数,再执行C的构造函数
之后执行X的构造函数,再执行Y的构造函数,然后执行Z的构造函数
最后执行自己的构造函数
//18.23
(a)允许
(b)允许
(c)允许
(d)允许
//18.24
pb->print(); //正确,调用Panda::print
pb->toes(); //错误,不属于ZooAnimal的接口
pb->currdle(); //错误,不属于ZooAnimal的接口
pb->highlight(); //错误,不属于ZooAnimal的接口
delete pb; //ZooAnimal定义了虚析构
//所以会调用Panda的虚析构函数,会依次调用Endangered、Bear和ZooAnimal的析构函数
//18.25
(a)调用MI的print
(b)调用MI的print
(c)调用MI的print
(d)(e)(f)因为是虚析构,所以会执行MI的析构。析构顺序和构造顺序相反
MI->D2->Base2->D1->Base1
//18.26
MI类定义了自己的print,不会出现二义性问题
//18.27
(a)ival、dval、cval、fval、sval、ival、dvec和print
(b)Base1::dval和Derived::dval print
(c)MI::dval = Base1::dval + Derived::dval;
(d)fval = dvec[dvec.size() - 1];
(e)sval[0] = cval;
//18.28
使用void bar(char)和ival不需要限定符
访问foo和cval都需要限定符
//18.29
(a)Class->Base->D1->D2->MI->Class->Final。析构函数相反
(b)一个Base部分,两个Class部分
(c)(a)错误,不能用派生类指针指向基类对象
	(b)不确定
	(c)错误,不能用指向基类的指针给派生类指针赋值
//18.30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值