1. 程式人生 > >C++Primer_Chap15_面向物件程式設計_List01_OOP:概述_筆記

C++Primer_Chap15_面向物件程式設計_List01_OOP:概述_筆記

面向物件程式設計(object-oriented programming)的核心思想是資料抽象、繼承和動態繫結。

  使用資料抽象,可以將類的介面與實現分離

  使用繼承,可以定義相似的型別並對其相似關係建模

  使用動態繫結,可以一定程度上忽略相似型別的區別,而以統一的方式使用它們的物件。

繼承

  基類負責定義在層次關係中所有類共同擁有的成員,而每個派生類定義個字持有的成員。基類將型別相關的函式與派生類不做改變直接繼承的函式區分對待。對於某些函式,基類希望它的派生類各自定義合適自身的版本,此時基類就將這些函式宣告成虛擬函式(virtual function).

class Quote{
public:
    std::string isbn() const;
    virtual double net_price(std::size_t n) const;
};

class Bulk_quote : public Quote{
public:
    double net_price(std::size_t const override;
};

  派生類必須在其內部對所有重新定義的虛擬函式進行宣告。派生類可以在這樣的函式之前加上virtual關鍵字,但C++11標準允許派生類顯式地註明它將使用哪個成員函式改寫基類的虛擬函式,具體措施是在該函式的形參列表之後新增一個override關鍵字

動態繫結

  通過使用動態繫結(dynamic binding),我們可以用同一段程式碼分別處理Quote和Bulk_quote的物件。

double price_total( ostream &os, const Quote &item, size_t n)
{
	double ret = item.net_price(n);
	os << "ISBN:" << item.isbn()
		<< "# sold:" << n << " total due:" << ret << endl;
	return ret;
}

  在函式的執行時,版本由實參決定,即在執行時選擇函式的版本,所以動態繫結有時又被稱為執行時繫結(run-time binding).在C++語言中,當我們使用基類的引用(指標)呼叫一個虛擬函式時將傳送動態繫結