1.虛函式:在類的成員函式前加virtual即構成虛函式。作用是通過基類的指標與引用呼叫派生類的成員函式
2.多型的概念
多型即多種形態,通過呼叫不同的函式實現不同的功能。
如買票機制,不同的物件買票的制度也不同,如普通人買全票,學生可買半價票等。
3.多型的條件
(1)虛函式的重寫(子類定義乙個與父類的完全相同的虛函式)
(2)父類的指標或引用
當使用父類的指標或引用呼叫這個重寫的虛函式時,指標指向父類就呼叫父類的虛函式,指向子類就呼叫子類的虛函式。
注意:
(1)基類(父類)必須為虛函式,派生類(子類)保持這一特性。(相當於父類必須為虛函式,子類可為虛函式也可不為虛函式)
(2)除協
變外,派生類(子類)的重寫必須保持函式名、引數、返回值與基類(父類)保持相同。
(3)協變就是派生類的中函式的返回值可以與基類的不同,但返回值必須是指向父子關係的指標或引用。
(4)靜態成員函式不能為虛函式。因為靜態成員函式就相當於是受命名空間限制的普通成員函式,可以把它看做是乙個類。它與類的例項無關,在呼叫時不會呼叫隱含的this指標,因此不能為虛函式。簡言之,成員函式例項相關,靜態函式類相關,虛函式相當於成員函式,所以靜態函式不能為虛函數。
(5)在類外定義虛函式,只能在宣告時加virtual,不能在類外定義時加virtual。
(6)建構函式、拷貝建構函式、賦值運算子過載不能是虛函式。
(7)析構函式要定義成虛函式---保證正確呼叫對應的函式
正常情況下,子類物件在構造時先呼叫父類的建構函式,再呼叫子類的建構函式;析構時先呼叫子類的析構函式,再呼叫父類的析構函式。可以理解為子
類有兩部分,一部分是從父類繼承的,一部分是自己定義的,初始化的時候先呼叫父類初始化從父類中繼承的,再呼叫子類初始化自己定義的。析構函式也
是一樣,子類的析構函式只會析構自己定義的一部分,若父類不定義成虛函式,在delete時只會呼叫父類的析構而不呼叫子類的析構,最終會導致記憶體洩漏
的問題。
4.普通呼叫&多型呼叫
普通呼叫:與型別有關,呼叫速度快
多型呼叫:與物件有關,呼叫速度較普通呼叫慢
1.過載:
同一作用域;
函式名相同;
引數(型別、個數)不同
void func()
std::cout << "func1()"
<< std::endl;
void func(int
n)std::cout << "func12()"
<< std::endl;
int main()
func();//func1
func(1);//func2
return 0;
2.重寫(覆蓋)
不同作用域(乙個子類,乙個父類);
函式名、引數、返回值相同(協變除外);
加virtual
classp1
public:
virtual
void print()
std::cout << "p1 _a"
<< std::endl;
public:
int _a;
class
p2:publicp1
public:
virtual
void print()
std::cout << "p2 _b"
<< std::endl;
public:
int _b;
void show(p1& p)
p.print();
int main()
p1 a;
p2 b;
a.print();//p1 _a
b.print();//p2_b
return 0;
3.重定義(隱藏)
不同作用域(乙個子類,乙個父類);
函式名相同;
子類或父類中不是重寫的就是重定義
虛函式的指標有虛函式表,虛函式表相當於乙個指標陣列,裡邊存的是虛函式的函式指標 ,通常vs環境下以0結尾。
下圖為子類和父類的虛函式基表:在32位機虛函式表是4位元組,在64位機虛函式表是8位元組
所以,上圖中父類包含乙個虛函式表以及乙個整形變數,所以大小為8;子類在繼承了父類的基礎上自己還有乙個整形變數,所以是12。
物件導向特性 多型
1 抽象類和方法 只在父類中宣告,在子類中實現,用abstract宣告。作用是給子類作規範。規則 抽象類不能例項化,只能被繼承 抽象方法必須被子類方法重寫。建立 abstract class computer 抽象類裡面的抽象方法必須在子類裡面重寫,不然會報錯。abstract class comp...
物件導向特性 多型
多型的概念 類的多型是類的重要特性,它可以讓例項在呼叫他們的共同屬性時不考慮具體的類,體現的是一種執行時的繫結關係 動態繫結 類的多型體現在同乙個類例項化出來的物件呼叫同乙個方法,執行的邏輯不相同 注意 體現類的多型有兩個條件 1.有子類的繼承 2.子類需要呼叫這個方法 所以,多型算是繼承的實現細節...
物件導向特性 多型
動態繫結 父類的引用,引用子類的物件 直接賦值 student stu newcollegestudent df soft 方法傳參 3.返回值接收 滿足動態繫結的條件 向上轉型並且通過父類呼叫子類重寫的方法 編譯時 呼叫父類的方法 執行時 呼叫子類重寫的方法。子類實現父類同名方法,並且引數的型別和...