虛函式:用關鍵字virtual修飾的、類的成員函式;
虛函式定義:語法形式
class
x
虛函式的意義(即虛函式的虛特徵)
基類指標(或引用)>指向 派生類的物件時,通過該指標(或引用)訪問派生類中的虛函式時,將呼叫該指標(或引用)實際所指物件的成員函式!(指標和引用給基類的是派生類的位址)
例子:
classb}
classd:
public b
}void
main()
輸出 :b::f(
)
classb}
classd:
public b
}void
main()
輸出 :d::f(
)
總結:
通過指向派生類物件的基類指標(或基類引用)訪問函式成員f()時,
步驟一:在基類中,用virtual宣告成員函式為虛函式;
步驟二:在派生類中重定義(覆蓋)此函式;
步驟三:定義乙個指向派生類物件、基類型別的指標變數(或引用);
步驟四: 通過該基類指標變數(或引用)呼叫此虛函
1、一旦將某個成員函式宣告為虛函式後, 如b::f(),它在繼承體系中就永遠成為虛函式了!
#include
using
namespace std;
classa;
};classb:
public a };
classc:
public b };
classd:
public c };
void
main()
訪問的是派生類中基類a的物件(因為a的f()並不是虛函式),此為賦值相容。
賦值相容:由基類的指標訪問派生類中間的基類物件
2、如果基類定義了虛函式,當通過基類指標(或引用)呼叫派生類物件時,將訪問到它們實際所指物件中的虛函式版本
#include
using
namespace std;
classa;
};classb:
public a };
classc:
public b };
classd:
public c };
void
main()
3、只有通過基類物件的指標和引用訪問派生類物件的虛函式時,才能體現虛函式的特性。
#include
classb;
};classd:
public b;}
;void
main()
只能通過基類物件的指標和引用才能實現虛函式的特性
4、派生類中的虛函式要保持其虛特徵,必須與基類中的函式原型完全相同,否則就是普通的過載函式,與基類的虛函式無關。
#include
classb;
};classd:
public b};
void
main()
5、派生類通過從基類繼承來的成員函式 呼叫 虛函式時,將訪問到派生類中的版本。
多型性與虛函式 物件導向程式設計
多型性 向不同的物件傳送同乙個訊息,不同的物件在接收時會產生不同 的行為。靜態多型性 由函式中在和運算子過載形成。動態多型性 通過虛函式實現。先建立乙個point類,包含資料成員x,y 座標點 以它為基類,派生出乙個circle 圓 類,增加資料成員r 半徑 再以circle類為直接基類,派生出乙個...
C 物件導向基礎 6 虛函式與多型
非虛函式 常規的函式,在繼承時不希望子類重寫 override 如int objectid const 虛函式 前面加了關鍵字 virtual 的函式,在繼承時希望子類重寫,但已有預設定義 如virtual void error const std string msg 純虛函式 前面加了關鍵字 v...
C C 物件導向程式設計特性 多型(虛函式表原理)
include include using namespace std 定義兩個函式指標型別 typedef void pfunc void typedef int psum int,int 定義測試基類 class a private 定義私有的虛函式sum 用於測試 virtual int su...