49 多型的概念和意義

2021-08-19 20:06:25 字數 1478 閱讀 3203

解決函式重寫碰到賦值相容性原則的矛盾

父類中被重寫的函式依然會繼承給子類,子類中重寫的函式將覆蓋父類中的函式,通過作用域分辨符(::)可以訪問到父類中的函式。

child c;

parent* p=&c;

c.parent::print();    // 從父類中繼承

c.print();         // 在子類中重寫

p->print();     //列印父類中定義->不是我們期望的,因為p指向子類物件,我們期望列印子類中的函式

物件導向中期望的行為:根據實際的物件型別判斷如何呼叫重寫函式。

父類指標(引用)指向-父類物件則呼叫父類中定義的函式,子類物件則呼叫子類中定義的重寫函式。(根據實際物件型別而不是根據指標型別)

物件導向中的多型的概念:根據實際的物件型別決定函式呼叫的具體目標。同樣的呼叫語句在實際執行時有多種不同的表現形態。

p->print();p指向父類物件,呼叫: 

void print()

};class child : public parent

};void how_to_print(parent* p)

int main()

virtual void func(int i)

virtual void func(int i, int j)

};class child : public parent

void func(int i, int j, int k)         //同名覆蓋父類中的三個函式,與上乙個函式過載

};void run(parent* p)

int main()

};class master

};class newmaster : public master

};void field_pk(master* master, boss* boss)

else

}int main()

{master master;

boss boss;    

cout << "master vs boss" << endl;    

field_pk(&master, &boss);    

cout << "newmaster vs boss" << endl;    

newmaster newmaster;    

field_pk(&newmaster, &boss);    

return 0;

函式重寫只可能發生在父類與子類之間,根據實際物件的型別確定呼叫的具體函式,virtual關鍵字是c++中支援多型的唯一方式,被重寫的虛函式可表現出多型的特性。

多型解決函式重寫與賦值相容原則的矛盾,當子類重寫了父類的成員函式時,並且定義乙個父類指標,父類指標即可以指向父類物件,也可以指向子類物件,無論是指向父類物件還是子類物件,在呼叫時,編譯器預設為呼叫父類的成員函式,所以為了能夠使編譯器呼叫子類物件,提出了多型。指向父類物件就呼叫父類成員函式,指向子類就呼叫子類成員函式。

8 多型的概念和意義

多型也就是物件導向中期望的行為。1 根據實際的物件型別判斷如何呼叫重寫函式 2 父類指標 引用 指向 父類物件則呼叫父類中呼叫的函式 子類物件則呼叫子類中定義的重寫函式 總的來說就是根據實際的物件型別決定函式呼叫的具體目標,同樣的呼叫語句在實際執行時有多種不同的表現形態。通過關鍵字virtual來對...

C 中多型的概念和意義

1 函式重寫回顧 示例 child c parent p c c.parent print 從父類中繼承 i m parent.c.print 在子類中重寫 i m child.p print 父類中定義 i m parent.不是我們期望的版本,因為 p 指向了子類物件,期望呼叫子類版本 2 面相...

繼承的概念和意義

組合關係的特點 將其他類的物件作為當前類的成員使用 當前類的物件與成員物件的生命週期相同 成員物件在用法上與普通物件完全一致 物件導向中的繼承子類之間的父子關係 子類擁有父類的所有屬性和行為 子類就是一種特殊的父類 子類物件可以當做父類物件使用 子類中可以新增父類沒有的方法和屬性 class par...