49_多態(tài)的概念和意義

1. 多態(tài)的概念

面向?qū)ο笾衅谕男袨椋?strong>根據(jù)實(shí)際的對(duì)象類型判斷如何調(diào)用重寫(xiě)函數(shù)。

  • 如果父類指針(引用)指向父類對(duì)象,則調(diào)用父類中定義的函數(shù);
  • 如果父類指針(引用)指向子類對(duì)象,則調(diào)用子類中定義的重寫(xiě)函數(shù)。

面向?qū)ο笾?strong>多態(tài)的概念:根據(jù)實(shí)際的對(duì)象類型決定函數(shù)調(diào)用的具體目標(biāo),同樣的調(diào)用語(yǔ)句在實(shí)際運(yùn)行時(shí)有多種不同的表現(xiàn)形式。

C++語(yǔ)言直接支持多態(tài)的概念:

  • 通過(guò)使用virtual關(guān)鍵字對(duì)多態(tài)進(jìn)行支持
  • virtual聲明的函數(shù)被重寫(xiě)后具有多態(tài)特征
  • virtual聲明的函數(shù)叫做虛函數(shù)

編程說(shuō)明:多態(tài)的初探

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    virtual void print()    // add virtual keyword ==> polymorphism
    {
        cout << "I'm Parent." << endl;
    }
};

class Child : public Parent
{
public:
    void print()    
    {
        cout << "I'm Child." << endl;
    }
};

void how_to_print(Parent* p)
{
    p->print();     // 展現(xiàn)多態(tài)的行為
}

int main()
{
    Parent p;
    Child c;
    
    how_to_print(&p);   // Expected to print : I'm Parent.
    how_to_print(&c);   // Expected to print : I'm Child.

    return 0;
}

輸出結(jié)果:

I'm Parent.
I'm Child.

2. 多態(tài)的意義

  • 在程序運(yùn)行過(guò)程中展現(xiàn)出動(dòng)態(tài)的特性
  • 函數(shù)重寫(xiě)必須多態(tài)實(shí)現(xiàn),否則沒(méi)有意義
  • 多態(tài)是面向?qū)ο蠼M件化程序設(shè)計(jì)的基礎(chǔ)特性

3. 靜態(tài)聯(lián)編(static binding)和動(dòng)態(tài)聯(lián)編(dynamic binding)

靜態(tài)聯(lián)編:在程序的編譯期間就能確定具體的函數(shù)調(diào)用,如函數(shù)重載
動(dòng)態(tài)聯(lián)編:在程序實(shí)際運(yùn)行后才能確定具體的函數(shù)調(diào)用,如函數(shù)重寫(xiě)

編程說(shuō)明:動(dòng)態(tài)聯(lián)編和靜態(tài)聯(lián)編

#include <iostream>
#include <string>

using namespace std;

class Parent
{
public:
    virtual void func()
    {
        cout << "void func() " << endl;
    }
    
    virtual void func(int i)
    {
        cout << "void func(int i): " << i<< endl;
    }
    
    virtual void func(int i, int j)
    {
        cout << "void func(int i, int j): " << "(" << i << ", " << j << ")" << endl;
    }
};

class Child : public Parent
{
public:
    void func(int i, int j)
    {
        cout << "void func(int i, int j): " << i + j << endl; 
    }
    
    void func(int i, int j, int k)
    {
        cout << "void func(int i, int j, int k): " << i + j + k << endl;
    }
};

void run(Parent* p)
{
    p->func(1, 2);  // dynamic binding  
}


int main()
{
    Parent p;
    
    p.func();       // static binding
    p.func(1);      // static binding
    p.func(1, 2);   // static binding
    
    cout << endl;
    
    Child c;
    
    c.func(1, 2);   // static binding
    
    cout << endl;
    
    run(&p);        
    run(&c);        

    return 0;
}

輸出結(jié)果:

void func() 
void func(int i): 1
void func(int i, int j): (1, 2)

void func(int i, int j): 3

void func(int i, int j): (1, 2)
void func(int i, int j): 3

4. 小結(jié)

  • 函數(shù)重寫(xiě)只可能發(fā)生在父類和子類之間
  • 根據(jù)實(shí)際對(duì)象的類型確定調(diào)用的具體函數(shù)
  • virtual關(guān)鍵字是C++中支持多態(tài)的唯一方式
  • 被重寫(xiě)的虛函數(shù)可以表現(xiàn)出多態(tài)的特性
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容