物件導向的特性 多型

2021-08-21 19:28:35 字數 2505 閱讀 5538

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.返回值接收 滿足動態繫結的條件 向上轉型並且通過父類呼叫子類重寫的方法 編譯時 呼叫父類的方法 執行時 呼叫子類重寫的方法。子類實現父類同名方法,並且引數的型別和...