C++的多態(tài)總結

多態(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)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容