derived class 的constructor 调用

 系统复习一遍c++,发现很多细节的东西确实不牢靠了,写点儿总结,做笔记吧

1: 如果没有提供任何构造函数

     compiler 会 synthesize  一个出来,这个synthesized construtor 会首先初始化 base class 那部分,那面向对象的原则当然是自己的事情自己做,base part 的初始化,肯定会调用base class 的construtor 来初始化(如果base class 提供了的话),如果base class 没有提供,那就会调用base class 的synthesized constructor。

 

2:提供默认的构造函数(一个示例,一段描述,够了)

   class Bulk_item : public Item_base {
   public:
       Bulk_item(): min_qty(0), discount(0.0) { }
       // as before
   };

 

    The effect of running this constructor is that first the Item_base part is initialized using the Item_base default constructor. That constructor sets isbn to the empty string and price to zero. After the Item_base constructor finishes, the members of the Bulk_item part are initialized, and the (empty) body of the constructor is executed.

 

3:给base class construtor 传参数

原则是Only an Immediate Base Class May Be Initialized

注释: Immediate :有直接的,最接近的意思

   这是一个很tricky 的问题,你在derived class 中定义constructor 的时候,可以在initializer list 中 调用base class 的construtor

     class Bulk_item : public Item_base {
     public:
         Bulk_item(const std::string& book, double sales_price,
                   std::size_t qty = 0, double disc_rate = 0.0):
                      Item_base(book, sales_price),
                      min_qty(qty), discount(disc_rate) { }
         // as before
      };

这样,就可以传递参数给这个construtor 。

 

   那么,如果class 的hierarchy 非常高的话,也就是说很多层,那么你能给传递的只有离你最近的那一层的参数,再往上的层次,由离他最近的下面的class 来传递,管理,下面的两个类,Bulk_item  只能给Disc_item 的构造函数传参,至于Item_base  ,就由Disc_item 来传递好了。

 

    // class to hold discount rate and quantity
    // derived classes will implement pricing strategies using these data
    class Disc_item : public Item_base {
   public:
        Disc_item(const std::string& book = "",
                  double sales_price = 0.0,
                  std::size_t qty = 0, double disc_rate = 0.0):
                    Item_base(book, sales_price),
                    quantity(qty), discount(disc_rate) { }
        protected:
            std::size_t quantity; // purchase size for discount to apply
            double discount;      // fractional discount to apply
     };

 

  // discount kicks in when a specified number of copies of same book are sold
     // the discount is expressed as a fraction to use to reduce the normal price
     class Bulk_item : public Disc_item {
     public:
         Bulk_item(const std::string& book = "",
                   double sales_price = 0.0,
                   std::size_t qty = 0, double disc_rate = 0.0):
              Disc_item(book, sales_price, qty, disc_rate) { }         // redefines base version so as to implement bulk purchase discount policy
         double net_price(std::size_t) const;
     };

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值