解決函式重寫碰到賦值相容性原則的矛盾
父類中被重寫的函式依然會繼承給子類,子類中重寫的函式將覆蓋父類中的函式,通過作用域分辨符(::)可以訪問到父類中的函式。
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...