一:虛基類
解決二義性,防止雙份拷貝間接基類。(否則得用作用域分辨符來區分進行的多個拷貝)
將共同基類設定為虛函式,這是從不同的路徑繼承過來的同名資料成員在記憶體中就只有乙個拷貝,同乙個函式名也只有乙個對映。
虛基類的宣告是在派生類的定義過程中進行的,語法形式為:
class 派生類名:virtual繼承方式 基類名
虛基類及派生類的建構函式,例如:
#include
usingnamespace std;
classb0
public:
b0(int i)
private:
int nv;
classb1:virtual public b0
public:
b1(int i):b0(i){};
classb2:virtual public b0
public:
b2(int i):b0(i){};
classd1:public b1,public b2
public:
d1(int i):b1(i),b2(i),b0(i){};
二:虛函式
1)虛函式主要是實現執行時多型。虛函式的宣告智慧型出現在類定義中的函式原型宣告中,2)而不能在成員函式實現的時候。
2)只有使用指標或者引用的方式呼叫虛函式時,虛函式才能起到執行時多型的作用。
3)在程式中如果派生類沒有顯式的給出虛函式的宣告,系統會根據以下規則來判斷派生類中的函式成員是否是虛函式:
*是否與基類的虛函式有相同的名稱
*是否與基類的虛函式有相同的引數個數及相同的對應引數型別。
*相同的返回值
4)只有虛函式是動態繫結的,如果派生類需要修改基類的行為,就應該將基類中相應的函式宣告為虛函式。
5)再重寫繼承來的虛函式時,如果函式有預設的形參值,千萬不要重新定義不同的值。原因是:雖然虛函式是動態繫結的,但預設值是靜態繫結的。
6)在c++中不能宣告虛建構函式,但可以宣告虛析構函式,如果乙個類的析構函式宣告為虛函式,那麼他派生而來的所有子類的析構函式也是虛函式。保證使用基類型別指標就能夠呼叫適當的析構函式針對不同的物件進行清理工作。
#include
usingnamespace std;
classbase
public:
virtual ~base(){cout<<"basedestruction"<
classderived:public base
public:
derived();
~derived();
private:
int *i_pointer;
derived::derived()
i_pointer = new int(0);
derived::~derived()
cout<<"derived destruction"<
delete i_pointer;
voidfun(base *b)
delete b;
intmain()
base *b = derived();
fun(b);
return 0;
如果父類沒宣告為虛函式,則不會呼叫子類的析構函式,造成記憶體洩露。
三:抽象類
抽象類是為了抽象和設計的目的建立的,建立抽象類是為了通過它多型的使用其中的成員函式。抽象類處於類層次的上層,抽象類無法例項化。
1) 純虛函式:是乙個在基類中宣告的虛函式,在基類中沒有定義具體的操作內容。
virtual 函式型別 函式名(參數列)=0;
2)帶有純虛函式的類為抽象類,抽象類不能例項化,但我們可以宣告乙個抽象類的指標和引用,通過指標和引用,我們就看就可以訪問派生類物件,這種訪問具有多型性特徵。
虛基類 純虛函式 抽象類
虛基類 純虛函式和抽象類 1 虛基類 在 多繼承 中講過的例子中,由類a,類b1和類b2以及類c組成了類繼承的層次結構。在該結構中,類c的物件將包含兩個類a的子物件。由於類a是派生類c兩條繼承路徑上的乙個公共基類,那麼這個公共基類將在派生類的物件中產生多個基類子物件。如果要想使這個公共基類在派生類中...
虛基類,抽象類,虛函式,純虛函式,virtual
虛基類 在說明其作用前先看一段 class a class b public a class b virtual public a 大家以為這段 的輸出結果是什麼?有的人可能會馬上回答funprint of class a 與 funprint of class b 因為第一次輸出是引用類a的實 例...
虛基類 虛函式 純虛函式和抽象類
一 虛基類 在 多繼承 中講過的例子中,由類a,類b1和類b2以及類c組成了類繼承的層次結構。在該結構中,類c的物件將包含兩個類a的子物件。由於類a是派生類c兩條繼承路徑上的乙個公共基類,那麼這個公共基類將在派生類的物件中產生多個基類子物件。如果要想使這個公共基類在派生類中只產生乙個基類子物件,則必...