系统复习一遍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;
};