当前位置:文档之家› C++Primer 第15章-面向对象编程-课后习题答案

C++Primer 第15章-面向对象编程-课后习题答案

第十五章面向对象编程1。

什么是虚成员?在类中被声明为virtual的成员,基类希望这种成员在派生类中重定义。

除了构造函数外,任意非static成员都可以为虚成员。

2。

给出protected访问标号的定义。

它与private有何不同?protected为受保护的访问标号,protected成员可以被该类的成员、友元和派生类成员(非友元)访问,而不可以被该类型的普通用户访问。

而private成员,只能被基类的成员和友元访问,派生类不能访问。

3。

定义自己的Item_base类版本。

class Item_base{public:Item_base( const string &book = '', double sales_price = 0.0) :isbn( book ), price( sales_price ) { }string book( ) const{return isbn;}virtual double net_price( size_t n ) c onst{return price * n;}virtual ~Item_base() { }private:string isbn;protected:double price;};4。

图书馆可以借阅不同种类的资料—书、CD、DVD等等。

不同种类的借阅资料有不同的登记、检查和过期规则。

下面的类定义了这个应用程序可以使用的基类。

指出在所有借阅资料中,哪些函数可能定义为虚函数,如果有,哪些函数可能是公共的。

(注:假定LibMember 是表示图书馆读者的类,Date是表示特定年份的日历日期的类。

)class Library{public:bool check_out( const LibMember& );bool check_in( cosnt LibMember& );bool is_late( const Date& today );double apply_fine();ostream& print( ostream& = count );Date due_date() const;Date date_borrowed() const;string title() const;const LibMember& member() const;};因为有不同的登记、检查、和过期规则,所以bool check_out( const LibMember& );bool check_in( cosnt LibMember& );bool is_late( const Date& today );double apply_fine();ostream& print( ostream& = count );这几个函数应该被定义为虚函数,print函数可能用于打印不同的项目的内同,也定义为虚函数。

其他几个函数,因为操作都有公共性质,所以应该是公共的。

5。

如果有,下面的声明中哪些是错误的?class Base { …};(a) class Derived : public Derived { … };(b) class Derived : Base { … };(c) class Derived : Private Base { … };(d) class Derived : public Base;(e) class Derived : inherits Base { … };(a) 错误,不能用类本身作为类的基类,(d) 声明类时,不可以包含派生列表。

(e) 派生不能用inherits6。

编写自己的Bulk_item类版本。

class Bulk_item : public item_base{public:double net_price( size_t cnt ) const{if ( cnt > min_qty )return cnt * ( 1- discount ) * price;elsereturn cnt * price;}private:size_t min_qty;double discount;};7。

可以定义一个类型实现有限折扣策略。

这个类可以给低于某个上限的购书量一个折扣,如果购买的数量超过该上限,则超出部分的书应按正常价格购买。

定义一个类实现这种策略。

class Ltd_item : public item_base{public:Ltd_item( const string& book = “”, double sales_price, size_t qty = 0, double disc_rate = 0 ) : item_base( book, sales_price), max_qty( qty ), discount( disc_rate ) { } double net_price( size_t cnt ) const{if ( cnt <= max_qty )return cnt * ( 1- discount ) * price;elsereturn cnt* price – max_qty * discount * price;}private:size_t max_qty;double discount;};8。

对于下面的类,解释每个函数:struct base{string name() { return basename; }// 返回私有成员basenamevirtual void print( ostream &os ) { os << basename; } // 打印私有成员basename private:string basename;};struct derived{void print() { print(ostream &os ); os << ““ << mem; } // 首先调用base类的ptint函数,然后打印一个空格和私有成员memprivate:int mem;};如果该代码有问题,如何修正?问题:没有声明类derived是从base派生过来的,改正为如下:struct base{base( string szNm ): basename( szNm ) { }string name() { return basename; } // 返回私有成员basenamevirtual void print( ostream &os ) { os << basename; } // 打印私有成员basename private:string basename;};struct derived :public base{derived( string szName, int iVal ): base( szName ), mem( iVal ) ( )void print() { print( base :: ostream &os ); os << ““ << mem; }private:int mem;};9。

给定上题中的类和如下对象,确定在运行时调用哪个函数:base bobj; base *bp1 = &base; base &br1 = bobj;derived dobj; base *bp2 = &doboj; base &br2 = dobj;(a) bobj.print();(b) dobj.print();(c) bp1->name();(d) pb2->name();(b) br1.print();(f) br2.print();(a) bobj.print(); 用的是基类的print函数(b) dobj.print(); 用的是派生类的print函数(c) bp1->name(); 用的是基类的name函数(d) pb2->name(); 用的是基类的name函数(b) br1.print(); 用的是基类的print函数(f) br2.print(); 用的是派生类的print函数10。

在15.2.1节的习题中编写一个表示图书馆借阅政策的基类。

假定图书馆提供下列种类的借阅资料,每一种有自己的检查和登记政策。

将这些项目组成一个继承层次:book atdio book recordchildren’s puppet sega video game videocdrom book Nintendo video game rental booksony playstation video game类book、record、children’s puppet、video继承自Library;类audio book ,cdrom book, rental book 继承自类book;类sega video game, Nintendo video game, sony playstation video game继承自类video.11。

在下列包含一族类型的一般抽象中选择一种(或者自己选择一个),将这些类型组织成一个继承层次。

(a) 图像文件格式(如gif, tiff, jpeg, bmp )(b) 几何图元(如矩形,圆,球形,锥形)(c) C++语言的类型(如类,函数,成员函数)对(b)中的几何图元组织成一个继承层次,基类Figure,矩形Rectangle, 圆cicle, 球形sphere,锥形Cone继承自Figure类。

12。

对上题中选择的类,标出可能的虚函数以及public和protected成员。

虚函数,比如计算图形面积的函数virtual double area(); 计算体积的函数virtual double cubage(); 求周长的函数virtual double perimeter();Figuer类的public 成员可能有两个图元的尺寸:xSize, ySize,其他类的protected成员可能有cone类和球形的zSize即Z轴尺寸,还有13。

对于下面的类,列出C1中的成员函数访问ConcreteBase的static成员的所有方式,列出C2类型的对象访问这些成员的所有方式。

struct ConcreteBase{static std::size_t object_count();protected:static std::size_t obj_count;};struct C1 : public ConcreteBase { //… }struct C2 : public ConcreteBase { // … }C1中的成员函数访问基类的static成员可以用( 1) ConcreteBase::成员名(2) C1::成员名(3) 通过C1类对象或对象的引用,使用(. )操作符访问(4) 通过C1类对象的指针,使用箭头(->)操作符访问(5) 直接使用成员名。

相关主题