基類
定義
class Quote
{
public:
Quote() = default;
Quote(const std::string &book, double sales_price):
bookNo(book), price(sales_price){ }
std::string isbn(){
return bookNo;
}
virtual double net_price(std::size_t n) const {
return n * price;
}
virtual ~Quote() = default;
private:
std::string bookNo; //爲啥設爲private?子類不就沒了嗎?
protected:
double price = 0.0;
};
什麼定義爲虛函數
如果想由子類直接繼承不改變,就定義爲普通函數;
如果想由子類更改,就定義爲虛函數。
虛函數特徵
1.通過指針或引用調用虛函數時,根據所指對象的類型選擇。而普通函數直接看形參了。
2.普通函數是編譯時解析;而虛函數是運行時綁定。
訪問控制與繼承
bookNo其實子類還有,就是無權直接訪問,但是能通過isbn()訪問。
派生類
定義
class Bulk_quote : public Quote
{
public:
Bulk_quote() = default;
Bulk_quote(const std::string &, double, std::size_t, double);
double net_price(std::size_t) const override;
private:
std::size_t min_qty = 0;
double discount = 0.0;
};
虛函數特徵
1.可以把派生類對象綁定到基類指針或引用上。
2.可以在前置寫virtual,也可以不寫。也可以註明override關鍵字
派生類對象組成
1.自己定義的成員的子對象
2.基類成員的子對象。
構造函數
基類部分的成員由基類初始化,不能幫着初始化。
Bulk_quote(const std::string &book, double p, std::size_t qty, double disc):Quote(book, p), min_qty(qty), discount(disc)
{
}
派生類聲明
class Bulk_quote: public Quote; //xxx
class Bulk_quote;
被用作基類的類
不能只聲明,還要定義,因爲需要明白基類成員分佈。
class Quote{}; //要寫定義
class Bulk_quote: public Quote {};
final禁止繼承
新標準定了一種方式
class noDerived final{};