2019-07-13 多態(tài)

多態(tài)


字面意思是多種狀態(tài)。在多態(tài)里涉及兩個定義。

  • 覆蓋:即子類繼承父類的同時重寫了父類的函數(shù),從而使父類中的同名函數(shù),以子類重寫的為準。前提條件,父類對應的函數(shù)為虛函數(shù)。
  • 隱藏:即子類繼承父類的同時重寫了父類的函數(shù),但是父類中的同名函數(shù),依然存在。只是子類默認調用的是重寫的函數(shù)。但是父類的函數(shù)還是存在的,可以以別的方式調用。前提:父類對應的函數(shù)非虛函數(shù)。

多態(tài)的本質:在一個類中創(chuàng)建虛函數(shù)后,會產生一個虛表,虛表中存儲者虛函數(shù)的地址,當重寫虛函數(shù)時,虛表的地址會發(fā)生改變。

下面我寫了一個簡單的demo

#include<iostream>
using namespace std;
class CAnimal
{
public:
    virtual void Description();
    void Feature();
};
class CBird:public CAnimal
{
public:
    void Description();
    void Feature();
};
int main()
{
    CAnimal animal;
    CBird bird;
    CAnimal *panimal = NULL;
    panimal = &animal;
    panimal->Description();
    panimal->Feature();
    cout << "........................................." << endl;
    panimal = &bird;
    panimal->Description();
    panimal->Feature();
    cout << "........................................." << endl;
    animal.Description();
    animal.Feature();
    cout << "........................................." << endl;
    bird.Description();
    bird.Feature();
    cout << "........................................." << endl;
    getchar();
    getchar();
    return 0;
}

void CAnimal::Description()
{
    cout << "動物" << endl;
}

void CAnimal::Feature()
{
    cout << "我是有生命的" << endl;
}

void CBird::Description()
{
    cout << "鳥兒" << endl;
}

void CBird::Feature()
{
    cout << "我是有生命的鳥兒,我會飛" << endl;
}

執(zhí)行結果如下:
動物
我是有生命的
.........................................
鳥兒
我是有生命的
.........................................
動物
我是有生命的
.........................................
鳥兒
我是有生命的鳥兒,我會飛
.........................................

用GDB調試查看虛表結果如下圖所示:

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

相關閱讀更多精彩內容

  • 繼承和多態(tài) 1. 繼承的優(yōu)缺點 優(yōu)點:(1)子類可以靈活地改變父類中的已有方法;(2)能夠最大限度的實現(xiàn)代碼重用。...
    MinoyJet閱讀 727評論 0 0
  • 什么是多態(tài)性? 多態(tài):相同對象收到不同消息或不同對象收到相同消息時產生不同的動作。C++支持兩種多態(tài)性:編譯時多態(tài)...
    showaichuan閱讀 652評論 0 3
  • 多態(tài)(1)靜態(tài)多態(tài)與動態(tài)多態(tài) 什么是多態(tài) 從字面上理解就是多種形態(tài)的意思。而多態(tài)一詞最初源自希臘語,其含義便是“多...
    kingZXY2009閱讀 2,456評論 0 2
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,664評論 1 32
  • 可以將我們的人類文明過程抽象這樣一個過程:獲取數(shù)據、分析數(shù)據、建立模型、預測未知。 由此開始出現(xiàn)了『大數(shù)據』概念。...
    潤一粟閱讀 170評論 0 0

友情鏈接更多精彩內容