多態(tài):
1.靜態(tài)多態(tài):是在編譯器的編譯期間完成的,編譯器會根據(jù)實際參數(shù)類型來選擇調用合適的函數(shù)
-函數(shù)重載
-泛型編程
2.動態(tài)多態(tài):在運行期間,根據(jù)基類的引用和指針指向的對象來確定具體應該調用哪一個虛函數(shù)
-虛函數(shù)
一定要注意,在不構成多態(tài)的情況下,base* b=new Derived;此時b指向的是派生類中的基類部分。
-overload(重載):名稱完全相同、參數(shù)(類型或者個數(shù))不相同的函數(shù)
(1)相同的范圍(在同一個類中);
(2)函數(shù)名字相同;
(3)參數(shù)不同;
(4)virtual 關鍵字可有可無。
-override(覆蓋):用來實現(xiàn)C++多態(tài)性的,子類重新改寫父類聲明為virtual的函數(shù)
(1)不同的范圍(分別位于派生類與基類);
(2)函數(shù)名字相同;
(3)參數(shù)列表完全相同;
(4)基類函數(shù)必須有virtual 關鍵字。
(5) 訪問限定符可以不同
-overwrite(改寫):派生類的函數(shù)屏蔽(或者稱之為“隱藏”)了與其同名的基類函數(shù)
(1)如果派生類的函數(shù)與基類的函數(shù)同名,但是參數(shù)不同。那么此時,不論有無virtual關鍵字,基類的函數(shù)將被隱藏。
(2)如果派生類的函數(shù)與基類的函數(shù)同名,并且參數(shù)也相同,但是基類函數(shù)沒有virtual關鍵字。那么此時,基類的函數(shù)被隱藏。
基類中定義的virtual虛函數(shù),在繼承子類中同名函數(shù)自動都屬于虛函數(shù),可以不需要virtual關鍵字。
多態(tài)的原理:
假設Base* b=new Base();通過sizeof(b)可以發(fā)現(xiàn),基類的虛函數(shù)指針和成員變量存儲在一起,指向虛函數(shù)表。就是通過虛函數(shù)表找到的虛函數(shù)入口。(見類的存儲)
對于派生類:
1.先將基類的虛函數(shù)表中的內容拷貝一份
2.如果派生類中對基類中的虛函數(shù)進行重寫,使用派生類的虛函數(shù)替換相同偏移量位置的基類虛函數(shù)
3.如果派生類中新增自己的虛函數(shù),按照其在派生類中的聲明次序,放在上述虛函數(shù)之后
類的存儲
類只是將數(shù)據(jù)成員保存在一起。用隱含的A * const p指針來作為this指針調用成員函數(shù)。
1.如何計算一個類的大小
class A1
{
public:
void f1()
{}
void f2()
{}
};
class A2
{
public:
void f1()
{}
private:
int a = 10;
};
class A3
{};
int main()
{
cout << sizeof(A1) << endl; //1
cout << sizeof(A2) << endl; //4
cout << sizeof(A3) << endl; //1
return 0;
}
一個類的大小,實際上就是該類中非靜態(tài)成員變量之和, 同時也要注意內存對齊,空類大小為1(在linux和VS下是1)