基類 quote,定義圖書的編號和**
// quote
class quote
// 拷貝/移動控制成員
quote(const quote &other) : bookno(other.bookno), price(other.price) {}
quote(quote &&other) : bookno(std::move(other.bookno)), price(std::move(other.price)) {}
quote &operator=(const quote &rhs);
quote &operator=(quote &&rhs);
string isbn() const
virtual double netprice(std::size_t n) const // 購買n本圖書的花費
virtual ostream &debugprint(ostream &os) const; // 列印成員資訊
virtual ~quote() = default;
private:
string bookno; // 圖書編號
protected:
double price = 0.0; // **,protected 訪問型別標識派生類可以訪問但是其他類不行
};// 成員實現
ostream "e::debugprint(ostream &os) const
quote "e::operator=(const quote &rhs)
bookno = rhs.bookno;
price = rhs.price;
return *this;
}quote "e::operator=(quote &&rhs)
bookno = std::move(rhs.bookno);
price = std::move(rhs.price);
return *this;
}// 公共函式,列印給定圖書購買n本的花費
// common debug_print
double printtotal(ostream &os, quote &item, std::size_t n)
子類 disquote,折扣基類,定義折扣需要的數量和折扣優惠(優惠是超過數量或者小於數量等在派生類中根據業務確定)
// disquote 折扣基類,定義折扣需要的數量和折扣優惠(優惠是超過數量或者小於數量等在派生類中根據業務確定)
class disquote : public quote
// 拷貝/移動控制成員
disquote(const disquote &other) : quote(other), quantity(other.quantity), discount(other.discount) {}
disquote(disquote &&other) : quote(std::move(other)), quantity(std::move(other.quantity)),
discount(std::move(other.discount)) {}
disquote &operator=(const disquote &rhs);
disquote &operator=(disquote &&rhs);
virtual double netprice(std::size_t n) const = 0; // 純虛函式
virtual ostream &debugprint(ostream &os) const override; // 列印成員資訊
protected:
std::size_t quantity = 0;
double discount = 0.0;
};// 成員實現
ostream &disquote::debugprint(ostream &os) const
disquote &disquote::operator=(const disquote &rhs)
quote::operator=(rhs);
quantity = rhs.quantity;
discount = rhs.discount;
return *this;
}disquote &disquote::operator=(disquote &&rhs)
quote::operator=(std::move(rhs));
quantity = std::move(rhs.quantity);
discount = std::move(rhs.discount);
return *this;
}
子類 bulkquote ,大於給定數量才有折扣優惠,否則按照原價計算
// bulkquote 大於給定數量才有折扣優惠,否則按照原件計算
class bulkquote : public disquote
using disquote::disquote; // "繼承"直接基類的建構函式
// 拷貝/移動控制成員
bulkquote(const bulkquote &other) : disquote(other)
bulkquote(bulkquote &&other) : disquote(std::move(other))
bulkquote &operator=(const bulkquote &rhs);
bulkquote &operator=(bulkquote &&rhs);
virtual double netprice(std::size_t n) const override;
virtual ostream &debugprint(ostream &os) const override; // 列印成員資訊
};// 成員實現
double bulkquote::netprice(std::size_t n) const else
}ostream &bulkquote::debugprint(ostream &os) const
bulkquote &bulkquote::operator=(const bulkquote &rhs)
disquote::operator=(rhs);
return *this;
}bulkquote &bulkquote::operator=(bulkquote &&rhs)
disquote::operator=(std::move(rhs));
return *this;
}
子類 slightquote, 小於給定數量的部分有折扣優惠,超過部分按照原價計算
// bulkquote 小於給定數量的部分有折扣優惠,超過部分按照原件計算
class slightquote : public disquote
using disquote::disquote; // "繼承"直接基類的建構函式
// 拷貝/移動控制成員
slightquote(const slightquote &other) : disquote(other)
slightquote(slightquote &&other) : disquote(std::move(other))
slightquote &operator=(const slightquote &rhs);
slightquote &operator=(slightquote &&rhs);
virtual double netprice(std::size_t n) const override;
virtual ostream &debugprint(ostream &os) const override; // 列印成員資訊
};// 成員實現
double slightquote::netprice(std::size_t n) const else
}ostream &slightquote::debugprint(ostream &os) const
slightquote &slightquote::operator=(const slightquote &rhs)
disquote::operator=(rhs);
return *this;
}slightquote &slightquote::operator=(slightquote &&rhs)
disquote::operator=(std::move(rhs));
return *this;
}
測試**:
// quote測試
void myquotetest()
除錯結果
參考 c++ primer 第五版 第15章
虛函式表和C 抽象基類
為什麼用 c 的純抽象基類來實現 com介面是可行的呢?這主要是由於純抽象類說定義的記憶體結構可以滿足 com對介面的需求。當定義乙個純抽象基類時,實際上定義的是乙個記憶體塊的結構,且其所有的實現都是一些具有相同的基本結構的記憶體塊。但是,此記憶體只有在派生類中實現此抽象基類時才會被分配。繼承抽象基...
C 抽象基類和純虛函式
為什麼c 要定義抽象基類?c 為什麼要定義抽象基類?抽象類就是類裡定義了純虛成員函式的類。純虛函式只提供了介面,並沒有具體實現。抽象類不能被例項化,通常是作為基類供子類繼承,子類中重寫虛函式,實現具體的介面。為什麼要定義抽象基類呢?依我所見主要有以下原因 1.最重要的原因是,可以將介面與實現分離。介...
c 純虛函式和抽象基類
c 物件導向程式設計的思想之一是可以使用繼承。繼承中乙個重要的思想是使用抽象基類 abstract base class,abc 假設我們開發乙個程式,需要使用橢圓和圓兩種圖形。因為圓是橢圓的一種特殊情形,根據繼承 is a 的思想,自然會想到先定義乙個eclipse類,再將circle類繼承自ec...