欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C++ 多態(tài)的兩種形式(靜態(tài)、動(dòng)態(tài))

 更新時(shí)間:2020年08月31日 10:29:14   作者:Dabelv  
這篇文章主要介紹了C++ 多態(tài)的兩種形式,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下

1.多態(tài)的概念與分類(lèi)

多態(tài)(Polymorphisn)是面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)的一個(gè)重要特征。多態(tài)字面意思為多種狀態(tài)。在面向?qū)ο笳Z(yǔ)言中,一個(gè)接口,多種實(shí)現(xiàn)即為多態(tài)。C++中的多態(tài)性具體體現(xiàn)在編譯和運(yùn)行兩個(gè)階段。編譯時(shí)多態(tài)是靜態(tài)多態(tài),在編譯時(shí)就可以確定使用的接口。運(yùn)行時(shí)多態(tài)是動(dòng)態(tài)多態(tài),具體引用的接口在運(yùn)行時(shí)才能確定。

靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)的區(qū)別其實(shí)只是在什么時(shí)候?qū)⒑瘮?shù)實(shí)現(xiàn)和函數(shù)調(diào)用關(guān)聯(lián)起來(lái),是在編譯時(shí)期還是運(yùn)行時(shí)期,即函數(shù)地址是早綁定還是晚綁定的。靜態(tài)多態(tài)是指在編譯期間就可以確定函數(shù)的調(diào)用地址,并生產(chǎn)代碼,這就是靜態(tài)的,也就是說(shuō)地址是早綁定。靜態(tài)多態(tài)往往也被叫做靜態(tài)聯(lián)編。 動(dòng)態(tài)多態(tài)則是指函數(shù)調(diào)用的地址不能在編譯器期間確定,需要在運(yùn)行時(shí)確定,屬于晚綁定,動(dòng)態(tài)多態(tài)往往也被叫做動(dòng)態(tài)聯(lián)編。

2.多態(tài)的作用

為何要使用多態(tài)呢?封裝可以使得代碼模塊化,繼承可以擴(kuò)展已存在的代碼,他們的目的都是為了代碼重用。而多態(tài)的目的則是為了接口重用。靜態(tài)多態(tài),將同一個(gè)接口進(jìn)行不同的實(shí)現(xiàn),根據(jù)傳入不同的參數(shù)(個(gè)數(shù)或類(lèi)型不同)調(diào)用不同的實(shí)現(xiàn)。動(dòng)態(tài)多態(tài),則不論傳遞過(guò)來(lái)的哪個(gè)類(lèi)的對(duì)象,函數(shù)都能夠通過(guò)同一個(gè)接口調(diào)用到各自對(duì)象實(shí)現(xiàn)的方法。

3.靜態(tài)多態(tài)

靜態(tài)多態(tài)往往通過(guò)函數(shù)重載和模版(泛型編程)來(lái)實(shí)現(xiàn),具體可見(jiàn)下面代碼:

#include <iostream>
using namespace std;

//兩個(gè)函數(shù)構(gòu)成重載
int add(int a, int b)
{
  cout<<"in add_int_int()"<<endl;
  return a + b;
}
double add(double a, double b)
{
  cout<<"in add_double_doube()"<<endl;
  return a + b;
}

//函數(shù)模板(泛型編程)
template <typename T>
T add(T a, T b)
{
  cout<<"in func tempalte"<<endl;
  return a + b;
}

int main()
{
  cout<<add(1,1)<<endl;					//調(diào)用int add(int a, int b)
  cout<<add(1.1,1.1)<<endl;		  	 	//調(diào)用double add(double a, double b)
  cout<<add<char>('A',' ')<<endl;		//調(diào)用模板函數(shù),輸出小寫(xiě)字母a
}

程序輸出結(jié)果:

in add_int_int()
2
in add_double_doube()
2.2
in func tempalte
a

4.動(dòng)態(tài)多態(tài)

動(dòng)態(tài)多態(tài)最常見(jiàn)的用法就是聲明基類(lèi)的指針,利用該指針指向任意一個(gè)子類(lèi)對(duì)象,調(diào)用相應(yīng)的虛函數(shù),可以根據(jù)指向的子類(lèi)的不同而調(diào)用不同的方法。如果沒(méi)有使用虛函數(shù),即沒(méi)有利用C++多態(tài)性,則利用基類(lèi)指針調(diào)用相應(yīng)函數(shù)的時(shí)候,將總被限制在基類(lèi)函數(shù)本身,而無(wú)法調(diào)用到子類(lèi)中被重寫(xiě)過(guò)的函數(shù)。因?yàn)闆](méi)有多態(tài)性,函數(shù)調(diào)用的地址將是一定的,而固定的地址將始終調(diào)用同一個(gè)函數(shù),這就無(wú)法“實(shí)現(xiàn)一個(gè)接口,多種實(shí)現(xiàn)”的目的了。

#include <iostream>
using namespace std;

class Base
{
public:
  virtual void func()
  {
    cout << "Base::fun()" << endl;
  }
};

class Derived : public Base
{
public:
  virtual void func()
  {
   cout << "Derived::fun()" << endl;
  }

};

int main()
{
  Base* b=new Derived;      //使用基類(lèi)指針指向派生類(lèi)對(duì)象
  b->func();            //動(dòng)態(tài)綁定派生類(lèi)成員函數(shù)func
  
  Base& rb=*(new Derived);    //也可以使用引用指向派生類(lèi)對(duì)象
  rb.func();        
}

程序輸出結(jié)果:

Derived::fun()
Derived::fun()

通過(guò)上面的例子可以看出,在使用基類(lèi)指針或引用指向子類(lèi)對(duì)象時(shí),調(diào)用的函數(shù)是子類(lèi)中重寫(xiě)的函數(shù),這樣就實(shí)現(xiàn)了運(yùn)行時(shí)函數(shù)地址的動(dòng)態(tài)綁定,即動(dòng)態(tài)聯(lián)編。動(dòng)態(tài)多態(tài)是通過(guò)“繼承+虛函數(shù)”來(lái)實(shí)現(xiàn)的,只有在程序運(yùn)行期間(非編譯期)才能判斷所引用對(duì)象的實(shí)際類(lèi)型,根據(jù)其實(shí)際類(lèi)型調(diào)用相應(yīng)的方法。具體格式就是使用virtual關(guān)鍵字修飾類(lèi)的成員函數(shù)時(shí),指明該函數(shù)為虛函數(shù),并且派生類(lèi)需要重新實(shí)現(xiàn)該成員函數(shù),編譯器將實(shí)現(xiàn)動(dòng)態(tài)綁定。

以上就是詳解C++ 多態(tài)的兩種形式(靜態(tài)、動(dòng)態(tài))的詳細(xì)內(nèi)容,更多關(guān)于C++ 靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++中異常處理的基本思想及throw語(yǔ)句拋出異常的使用

    C++中異常處理的基本思想及throw語(yǔ)句拋出異常的使用

    這篇文章主要介紹了C++中異常處理的基本思想及throw類(lèi)拋出異常的使用,也深入談到了異常被拋出后的棧解旋unwinding過(guò)程,需要的朋友可以參考下
    2016-03-03
  • C++動(dòng)態(tài)規(guī)劃中關(guān)于背包問(wèn)題講解

    C++動(dòng)態(tài)規(guī)劃中關(guān)于背包問(wèn)題講解

    可能有些讀者有接觸過(guò)動(dòng)態(tài)規(guī)劃,可能也有一些讀者以前完全不知道動(dòng)態(tài)規(guī)劃這個(gè)東西,別擔(dān)心,我這篇文章會(huì)為讀者做一個(gè)入門(mén),好讓讀者掌握這個(gè)重要的知識(shí)點(diǎn)
    2023-03-03
  • 在Ubuntu中安裝VSCode并配置C/C++開(kāi)發(fā)環(huán)境的方法步驟

    在Ubuntu中安裝VSCode并配置C/C++開(kāi)發(fā)環(huán)境的方法步驟

    這篇文章主要介紹了在Ubuntu中安裝VSCode并配置C/C++開(kāi)發(fā)環(huán)境的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 利用C++的基本算法實(shí)現(xiàn)十個(gè)數(shù)排序

    利用C++的基本算法實(shí)現(xiàn)十個(gè)數(shù)排序

    以下是對(duì)利用C++的基本算法實(shí)現(xiàn)十個(gè)數(shù)排序的代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • C語(yǔ)言的字符函數(shù)和字符串函數(shù)詳解

    C語(yǔ)言的字符函數(shù)和字符串函數(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的字符函數(shù)和字符串函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C語(yǔ)言基礎(chǔ)隱式類(lèi)型轉(zhuǎn)換與強(qiáng)制類(lèi)型轉(zhuǎn)換示例解析

    C語(yǔ)言基礎(chǔ)隱式類(lèi)型轉(zhuǎn)換與強(qiáng)制類(lèi)型轉(zhuǎn)換示例解析

    最接地氣的有關(guān)類(lèi)型轉(zhuǎn)換的介紹,此處對(duì)于類(lèi)型轉(zhuǎn)換的相關(guān)知識(shí)點(diǎn)做一些簡(jiǎn)要的介紹,作者實(shí)屬初學(xué),難免文章中有內(nèi)容理解不到位或者有不當(dāng)之處,還請(qǐng)朋友們不吝指正,希望大家多多給予支持
    2021-11-11
  • C/C++實(shí)現(xiàn)枚舉網(wǎng)上鄰居信息的示例詳解

    C/C++實(shí)現(xiàn)枚舉網(wǎng)上鄰居信息的示例詳解

    在Windows系統(tǒng)中,通過(guò)網(wǎng)絡(luò)鄰居可以方便地查看本地網(wǎng)絡(luò)中的共享資源和計(jì)算機(jī),本文將介紹一個(gè)簡(jiǎn)單的C++程序,使用Windows API枚舉網(wǎng)絡(luò)鄰居信息,并獲取對(duì)端名稱(chēng)、本機(jī)名稱(chēng)、主機(jī)名稱(chēng)以及主機(jī)IP等信息,文中通過(guò)代碼示例給大家講解非詳細(xì),需要的朋友可以參考下
    2023-12-12
  • C++實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)實(shí)例

    C++實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)實(shí)例

    本篇文章主要介紹了C++實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • C++實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目

    C++實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)通訊錄管理系統(tǒng)項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++中指向結(jié)構(gòu)體變量的指針

    C++中指向結(jié)構(gòu)體變量的指針

    結(jié)構(gòu)體變量的指針就是該變來(lái)那個(gè)所占據(jù)的內(nèi)存段的起始地址。可以設(shè)一個(gè)指針變量,來(lái)指向一個(gè)結(jié)構(gòu)體變量,此時(shí)該指針變量的值是結(jié)構(gòu)體變量的起始地址
    2013-10-10

最新評(píng)論