C Primer 第十五章 物件導向程式設計

2022-02-10 04:38:42 字數 2205 閱讀 8383

物件導向程式設計的核心思想是資料抽象,繼承和動態繫結。

oop概述

派生類通過使用派生類列表指明從哪個基類派生,派生類必須在其內部對所有重新定義的虛函式進行宣告。

在c++語言中,當我們使用乙個基類的引用或指標呼叫乙個虛函式時將發生動態繫結,動態繫結會在執行時選擇需要的函式版本,因此也叫執行時繫結。

定義基類和派生類

繼承結構中根節點的類通常定義虛析構函式。

關鍵字virtual只能出現在類內部的宣告語句之前而不能用於類外部的定義。基類中某個成員函式是虛函式,則派生類中該函式隱式的也是虛函式。

派生類能訪問基類的公有成員,不能訪問基類的私有成員。

派生類必須將那些繼承而來的需要覆蓋的成員重新宣告。

派生類經常覆蓋它繼承的虛函式,但不是必須的。

因為在派生類物件中包含有與其基類對應的組成部分,因此能把派生類的物件當成基類來使用。而且也能將基類的指標或引用繫結到派生類物件上。

首先初始化基類部分,然後按宣告的順序初始化派生類的成員。派生類不繼承基類的建構函式,每個類控制自己的資料成員的初始化。

派生類的作用域巢狀在基類的作用域之內。

無論有多少繼承,靜態成員只存在唯一的例項。

基類必須已經定義才能作為基類使用,因此乙個類不能派生自它自身。

在類名後跟關鍵字final可防止該類被當做基類使用。

我們可以將基類的指標或引用繫結到派生類的物件上,智慧型指標也接受派生類物件。該特性是物件導向的根本。

靜態型別在編譯時是已知的,動態型別直到執行時才已知。如果表示式即不是引用也不是指標,而動態型別永遠和靜態型別一致。

不存在從基類向派生型別的隱式轉換,但存在從派生類向基類型別的轉換,因為派生類包含基類的所有成員。

在物件之間不存在型別轉換,派生類向基類的自動轉換只對指標型別或引用型別有效。當我們給基類建構函式或給基類賦值派生類物件時,呼叫的都是基類的建構函式或拷貝賦值運算子,因此只能處理基類的成員。

當我們用乙個派生類物件為基類物件初始化或賦值時,只有該派生類物件的基類部分會被拷貝,移動或賦值,它的派生類部分會被忽略。

虛函式動態繫結只有在通過指標或引用呼叫虛函式時才會發生。

引用或指標的靜態型別與動態型別不同正是c++支援多型性的根本所在。

一旦某個函式被宣告成虛函式,則在所有派生類中它都是虛函式,在派生類中可以使用virtual關鍵字也可以不使用。

使用override關鍵字可以顯示標明派生類中的某個函式覆蓋了基類中的虛函式,如果因為引數或返回型別錯誤而沒能覆蓋基類虛函式,則編譯器將報錯,這給除錯錯誤提供更過資訊。如果不希望基類的函式被覆蓋,可以給基類的函式新增final關鍵字,這樣派生類將無法覆蓋該函式。final和override寫在引數列表和const和尾置返回型別後面。

如果呼叫虛函式時使用預設實參,則預設實參的值由呼叫的靜態型別決定,因此基類和派生類中的預設實參最好一致。

使用域運算子可以禁用虛函式的動態繫結,如basep->base::fun()。通常情況下,如果乙個派生類虛函式中需要呼叫基類版本,需要使用域運算子指定虛函式版本,如果未指定在派生類的虛函式中呼叫虛函式將會形成無線遞迴。

抽象基類

含有純虛函式的類或未覆蓋基類的純虛函式的派生類是抽象基類。抽象基類負責定義介面,我們不能直接建立乙個抽象基類的物件。純虛函式無需定義,在函式宣告的分號前面加=0宣告純虛函式。=0只能出現在類內部的虛函式宣告語句處。我們也可以為純虛函式提供定義,不過函式體必須定義在類的外部。

訪問控制與繼承

protected用來保護基類的成員不被類使用者訪問但可以被派生類訪問。

關係比較複雜,暫時不研究。。。。。。。。。。。。。。。

繼承中的類作用域

每個類定義乙個自己的作用域,當存在繼承關係時,派生類的作用域巢狀在基類的作用域中。

在編譯時進行名字查詢,即使物件是引用型別或指標型別,物件的那些成員可見由物件的靜態型別決定。

派生類的成員將隱藏同名的基類成員。通過作用域運算子可以訪問被隱藏的基類成員。除了覆蓋繼承而來的虛函式之外,派生類中最好不要定義同名的基類成員。

內層作用域的函式並不會過載外層作用域的函式,只會覆蓋。因此派生類中的函式成員不會過載基類中的函式,即使名字相同,引數不同,這樣只會隱藏基類中的同名函式。

派生類中同名的函式(引數列表不同)並不會覆蓋基類的虛函式,在派生類的派生類中仍然可以訪問該虛函式。

可以通過基類呼叫隱藏的虛函式,前提是使用指標型別或引用型別,這時呼叫虛函式時會進行執行時繫結。呼叫非虛函式時進行靜態繫結。

覆蓋過載的函式。。。。。。。。。。。

建構函式與拷貝控制

第十五章 物件導向程式設計 一

1 例子 2 派生類對基類的protected成員一樣沒有訪問許可權 3 引用和指標的靜態型別和動態型別可以不同,這是c 多型的基石 4 有的時候想不用多型的機制,可以使用如下方法 item base basep derived double d basep item base netprice 4...

第十五章 物件導向的程式設計

虛函式抽象基類 訪問控制和繼承 類作用域 建構函式與拷貝控制 容器與繼承 物件導向程式設計的核心思想是資料抽象 繼承 和動態繫結。型別轉換與繼承 可以使用using宣告改變成員的可訪問性。派生類可訪問的名字才可以使用using class預設私有繼承,struct預設公有繼承 名字查詢先於型別檢查,...

C primer 第十五章筆記 初稿

抽象,繼承與動態繫結都是基礎的方法。新標準新增override關鍵字,用於顯示宣告改寫基類虛函式,乙個重要的好處是讓編譯器幫助我們發現一些覆蓋時的失誤。動態繫結一般通過指標 引用 實現。虛函式派生類 final關鍵字 虛函式返回的型別通常與基函式匹配,但如果返回類本身指標可以不同,前提是派生類到基類...