C 物件導向(繼承 虛函式和抽象基類)

2021-10-10 19:43:22 字數 4529 閱讀 1734

基類 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...