C++primer第十五章答案(第五版)

C++primer第⼗五章答案(第五版)
C++primer第⼗五章答案(第五版)
15.1
在C++语⾔中基类必须将它的两种成员函数区分开来:⼀种是基类希望其派⽣类进⾏覆盖的函数;⼀种是基类希望派⽣类直接继承⽽不要改变的函数。对于前者,基类通常将其定义为虚函数(virtual)。
15.2
protected访问说明符和private⼀样不能够在类外被调⽤,但是派⽣类的成员函数可以访问基类的protected成员,⽽不能访问基类的private成员。
15.3
#pragma once
#include<iostream>
jnc mp3using namespace std;
class Quote网络蓝军
{
public:
Quote()=default;
Quote(const string& book,double sales_price):bookNo(book),price(sales_price){};
string isbn()const{return bookNo;};
virtual double net_price(size_t n)const{return n * price;};
virtual~Quote()=default;
private:
string bookNo;
protected:
double price =0.0;
};
#include"Quote.h"
double print_total(ostream& os,const Quote& item, size_t n)
{
double ret = item_price(n);
os <<"ISBN"<< item.isbn()<<"# sold: "<< n <<"total due: "<< ret << endl;
return ret;
}
15.4
错误,不能够⾃⼰派⽣⾃⼰王维凝
正确
错误,声明不能包括派⽣列表
15.5
#include"Quote.h"
class Bulk_quote:public Quote
{
public:
Bulk_quote()=default;
Bulk_quote(const string& name, size_t n,double price,double disc):Quote(name, price),min_qty(n),discount(disc){}; double net_price(size_t n)const override;
private:
size_t min_qty =0;
double discount =0;
};
inline double Bulk_quote::net_price(size_t n)const
{
if(n > min_qty)
return n * price *(1- discount);
else
return n * price;
}
15.6
int main()
{
Quote q("012345",30);
Bulk_quote b("012345",30,20,0.2);
print_total(cout, q,20);
print_total(cout, b,20);
}
//输出
ISBN 012345 # sold:20 total due:600
管锥编ISBN 012345 # sold:20 total due:480
15.7
**#pragma once
#include"Quote.h"
class Limit_quote:public Quote
{压差计
public:
Limit_quote()=default;
Limit_quote(const string & name,double price, size_t n,double disc):Quote(name, price),max_qty(n),discount(disc){}; double net_price(size_t n)const override;
private:
size_t max_qty=0;
double discount =0;
};
inline double Limit_quote::net_price(size_t n)const
{
if(n >= max_qty)
return(n - max_qty)* price + max_qty *(1- discount)* price;
else
return n *(1- discount)* price;
}**
15.8
静态类型是在编译时就已经确定的,它是变量声明时的类型和表达式⽣成的类型。
动态类型则是变量或表达式表⽰的内存中的对象的类型,动态类型直到运⾏时才可知。
15.9
基类指针或引⽤的类型可能与其动态类型不⼀致,如果表达时既不是引⽤也不是指针,则他的动态类型永远与静态类型⼀致。
15.10
read函数的参数为istream&,fstream作为iostream的派⽣类,可以作为iostream引⽤的动态类型传⼊。
15.11
void Quote::Debug()const
{
cout <<"This is Quote class"<< endl;
cout <<"bookNo="<< bookNo <<" price="<< price << endl;
}
void Bulk_quote::Debug()const
{
cout <<"This is Bulk_quote class"<< endl;
cout <<"bookNo="<<isbn()<<" price="<< price << endl;
cout <<"min_qty="<< min_qty <<" discount="<< discount << endl;
}
void Limit_quote::Debug()const
{
cout <<"This is Bulk_quote class"<< endl;
cout <<"bookNo="<<isbn()<<" price="<< price << endl;
cout <<"max_qty="<< max_qty <<" discount="<< discount << endl;
}
15.12
有必要,两者并不冲突,override标识符是代表该函数重载基类的虚函数,⽅便编译器检测错误。⽽final标识符是禁⽌继承⾃⼰的⼦类重载该虚函数。
15.13
derived类的print函数中调⽤了⾃⾝,会导致⽆限递归。
将print(os)改为base::print(os),在加上override标识符,表⽰该函数重载基类虚函数。
15.14
(a)调⽤base::print();
(b)调⽤derived::print()
(c)调⽤base::name()
(d)调⽤base::name()
谭徽在(e)调⽤base::print();
(f)调⽤derived::print()
15.15
#include"Quote.h"
class Disc_quote:public Quote
{
public:
Disc_quote()=default;
Disc_quote(string bookNo,double price,double disc, size_t q):Quote(bookNo, price),discount(disc),qty(q){};
double net_price(size_t)const=0;
protected:
double discount;
size_t qty;
};
#include"Disc_quote.h"
class Bulk_quote:public Disc_quote
{
public:
Bulk_quote()=default;
Bulk_quote(const string& name,double price, size_t n,double disc):Disc_quote(name, price,disc,n){}; double net_price(size_t n)const override;
void Debug()const override;
};
inline double Bulk_quote::net_price(size_t n)const
{
if(n >= qty)
return n * price *(1- discount);
else
return n * price;
}
void Bulk_quote::Debug()const
{
cout <<"This is Bulk_quote class"<< endl;
cout <<"bookNo="<<isbn()<<" price="<< price << endl;
cout <<"min_qty="<< qty <<" discount="<< discount << endl;
}
15.16
#pragma once
#include"Disc_quote.h"
class Limit_quote:public Disc_quote
{
public:
Limit_quote()=default;
Limit_quote(const string & name,double price, size_t n,double disc):Disc_quote(name, price, disc, n){}; double net_price(size_t n)const override;
void Debug()const override;
private:
size_t max_qty=0;
double discount =0;
};
inline double Limit_quote::net_price(size_t n)const
{
if(n >= max_qty)
return(n - max_qty)* price + max_qty *(1- discount)* price;
else
return n *(1- discount)* price;
}
void Limit_quote::Debug()const
{
cout <<"This is Bulk_quote class"<< endl;
cout <<"bookNo="<<isbn()<<" price="<< price << endl;
cout <<"max_qty="<< max_qty <<" discount="<< discount << endl;
}
15.17
不允许使⽤抽象类型“Disc_count”的对象,函数“Disc_quote::net_price”是纯虚函数。
15.18
如果是保护或私有继承,则派⽣类不能向基类转换
Base *p =&d1;// d1的类型是Pub_Derv,合法
p =&d2;// d2的类型是Priv_Derv,⾮法
p =&d3;// d3的类型是Prot_Derv,⾮法
p =&dd1;// dd1的类型是Derived_from_Public,合法
p =&dd2;// dd2的类型是Derived_from_Private,⾮法
p =&dd3;// dd3的类型是Derived_from_Protected,⾮法
15.19
不论D以什么⽅式继承B,D的成员函数和友元都能使⽤派⽣类向基类的转换;派⽣类向其直接基类的类型转换对于派⽣类和友元来说是永远可访问的。因此,Pub_Derv, Pro_Derv和Priv_Derv类中都合法。
如果D继承B的⽅式是公有的或者受保护的,则D的派⽣类的成员和友元可以使⽤D向B的类型转换;反之,如果D继承B的⽅式是私有的,则不能使⽤。因此,Derived_from_Public合法,Derived_from_Private和Derived_from_Protected都不合法。
15.20
15.21
(b)图形基元
15.22

本文发布于:2024-09-21 20:34:49,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/140712.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   类型   基类   成员   动态   不能   错误   标识符
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议