首页 > 编程语言 >C++primer练习15.1-14

C++primer练习15.1-14

时间:2022-08-18 19:14:51浏览次数:65  
标签:std 15.1 14 double price 练习 Quote print primer

练习15.1

什么是虚成员?

::需要派生类自己定义的成员

练习15.2

protected访问说明符与private有何区别?

::protected允许派生类访问,private一律不允许访问

练习15.3

定义你自己的Quote类和print_total函数

class Quote{
    
    public:
        Quote(const std::string& book,double sales_price):bookNo(book),price(sales_price){        }
        std::string isbn()const {return bookNo;        }
        virtual double net_price(std::size_t n)const
        {
            return price*n;
        }
        virtual ~Quote()=default;
    
    private:
        std::string bookNo;
        
    protected:
        double price =0.0;

};
#include <iostream>
double print_total(std::ostream &os,const Quote& item,std::size_t n)
{
    double ret=item.net_price(n);
    os<<" ISBN: "<<item.isbn()
    <<" # sold: "<<n<<" total due: "<<ret<<std::endl;
    
}

练习15.4

下面那条声明语句是不正确的?请解释原因

(C)不正确,声明不包含它的派生列表

练习15.5

定义你自己的Bulk_quote类

class Bulk_quote:public Quote{
    
    public:
        Bulk_quote()=default;
        Bulk_quote(const std::string& book,double p,std::size_t qty,double disc)
        :Quote(book,p),min_qty(qty),discount(disc){        }
        double net_price (std::size_t cnt)const override{
            if(cnt >=min_qty)
                return cnt * (1-discount) * price;
            else 
                return cnt * price ;        
        }
        
        
    private:
        std::size_t min_qty=0;
        double discount=0.0;
    
    
};

练习15.6

将Quote和Bulk_quote的对象传给print_total函数,检查函数是否正确 

int main()
{
    Bulk_quote a("1234",1,2,0.1);
    print_total(std::cout,a,10);
    
}

练习15.7

定义一个类使其实现一种数量受限的折扣策略,具体策略是:当购买书籍的数量不超过一个给定的限量时享受折扣,如果购买量一旦超过了限量,则超出部分原价销售

double net_price (std::size_t cnt)const override{
                
                if((cnt-qty)>0)
                        return cnt * (1-discount) * price+(cnt-qty)*price;
                else    
                        return cnt * (1-discount) * price;
        }

练习15.8

给出静态类型和动态类型的定义

::静态类型就是编译时的类型,动态类型是运行时实际的类型

练习15.9

在什么情况下表达式的静态类型可能与动态类型不同?请给出三个静态类型与动态类型不同的例子

::func(Quote&,int);派生类可以转换成基类引用

练习15.10

解释第284页中将ifstream传递给Sales_data的read函数是如何工作的

::传递给了一个输入流类的派生类

练习15.11

为你的Quote添加debug虚函数,令其分别显示两个类的数据成员

virtual void debug(){
            std::cout<<"bookNo: "<<bookNo<<" price: "<<price<<std::endl;
        } 

练习15.12

有必要将一个成员函数同时声明成override和final吗?为什么?

::看需求吧,一个类可以同时是派生类和基类

练习15.13

给定下面的类,解释每个print的机理

::derived的print函数无限调用自己了,可以base::print(os),显示使用基类函数

练习15.14

给定上一题的类以及下面这些对象,说明在运行时调用哪个函数

(a)基类print()

(b)派生类print()和基类print()

(c)基类name()

(d)基类name()

(e)基类name()

(f)派生类print和基类print()

 

标签:std,15.1,14,double,price,练习,Quote,print,primer
From: https://www.cnblogs.com/yddl/p/16599791.html

相关文章